@@ -159,6 +159,39 @@ static char almostEqualWithDefaultTolerance(double a, double b)
159159 return almostEqualRelativeAndAbs (a ,b ,DOUBLEEQUAL_REL ,DOUBLEEQUAL_TOTAL );
160160}
161161
162+ static double deltaData (char * varname , DataField * time , DataField * reftime , DataField * data , DataField * refdata )
163+ {
164+ unsigned int i , iRef , i2 ;
165+ double res , val , valRef , t ;
166+ res = 0 ;
167+ i = 0 ;
168+ for (iRef = 0 ;iRef < reftime -> n ;iRef ++ ){
169+ valRef = refdata -> data [iRef ];
170+ t = reftime -> data [iRef ];
171+ //get left and right reference point to interpolate
172+ while ((time -> data [i ] < t ))
173+ {
174+ i ++ ;
175+ }
176+ i2 = i + 1 ;
177+ //there is a result value at time t
178+ if (fabs (time -> data [i ]- t ) <= max ((0.0001 * time -> data [time -> n ]),1e-12 ))
179+ {
180+ val = data -> data [i ];
181+ }
182+ //interpolate result value at time t
183+ else
184+ {
185+ //printf("xl %f xr %f tl %f tr %f \n", data->data[i], data->data[i2], time->data[i], time->data[i2]);
186+ val = (data -> data [i2 ] - data -> data [i ])/(time -> data [i2 ] - time -> data [i ])* (t - time -> data [i ])+ data -> data [i ];
187+ }
188+ res += fabs (valRef - val );
189+ //fprintf(stderr, "at time %f, val: %f and valRef: %f and res %f\n",t,val,valRef, res);
190+ }
191+ return res ;
192+ }
193+
194+
162195static unsigned int cmpData (int isResultCmp , char * varname , DataField * time , DataField * reftime , DataField * data , DataField * refdata , double reltol , double abstol , DiffDataField * ddf , char * * cmpdiffvars , unsigned int vardiffindx , int keepEqualResults , void * * diffLst , const char * prefix )
163196{
164197 unsigned int i ,j ,k ,j_event ;
@@ -737,3 +770,164 @@ void* SimulationResultsCmp_compareResults(int isResultCmp, int runningTestsuite,
737770 return res ;
738771}
739772
773+ /* Common, huge function, for both result comparison and result diff */
774+ double SimulationResultsCmp_deltaResults (const char * filename , const char * reffilename , void * vars )
775+ {
776+ double res = 0 ;
777+ unsigned int i ,size ,size_ref , len , k , j ;
778+ unsigned int ncmpvars = 0 ;
779+ void * allvars ,* allvarsref ;
780+ char * var ,* var1 ;
781+ char * * cmpvars = NULL ;
782+ int suggestReadAll = 0 ;
783+ DataField time ,timeref ,data ,dataref ;
784+ const char * timeVarName , * timeVarNameRef ;
785+ int offset , offsetRef ;
786+ const char * msg [2 ] = {"" ,"" };
787+
788+ /* open files */
789+ /* fprintf(stderr, "Open File %s\n", filename); */
790+
791+ SimulationResultsImpl__close (& simresglob_c );
792+ SimulationResultsImpl__close (& simresglob_ref );
793+
794+ if (UNKNOWN_PLOT == SimulationResultsImpl__openFile (filename ,& simresglob_c )) {
795+ msg [0 ] = filename ;
796+ c_add_message (NULL ,-1 , ErrorType_scripting , ErrorLevel_error , gettext ("Error opening file: %s." ), msg , 1 );
797+ return -1 ;
798+ }
799+ /* fprintf(stderr, "Open File %s\n", reffilename); */
800+ if (UNKNOWN_PLOT == SimulationResultsImpl__openFile (reffilename ,& simresglob_ref )) {
801+ msg [0 ] = filename ;
802+ c_add_message (NULL ,-1 , ErrorType_scripting , ErrorLevel_error , gettext ("Error opening reference file: %s." ), msg , 1 );
803+ return -1 ;
804+ }
805+
806+ size = SimulationResultsImpl__readSimulationResultSize (filename ,& simresglob_c );
807+ /*fprintf(stderr, "Read size of File %s size= %d\n", filename,size);*/
808+ size_ref = SimulationResultsImpl__readSimulationResultSize (reffilename ,& simresglob_ref );
809+ /*fprintf(stderr, "Read size of File %s size= %d\n", reffilename,size_ref);*/
810+
811+ /* get vars to compare */
812+ cmpvars = getVars (vars ,& ncmpvars );
813+ /* if no var compare all vars */
814+ allvars = SimulationResultsImpl__readVarsFilterAliases (filename ,& simresglob_c );
815+ allvarsref = SimulationResultsImpl__readVarsFilterAliases (reffilename ,& simresglob_ref );
816+ if (ncmpvars == 0 ) {
817+ suggestReadAll = 1 ;
818+ cmpvars = getVars (allvarsref ,& ncmpvars );
819+ if (ncmpvars == 0 ){
820+ c_add_message (NULL ,-1 , ErrorType_scripting , ErrorLevel_error , gettext ("Error Getting Vars." ), msg , 1 );
821+ return -1 ;
822+ }
823+ }
824+ #ifdef DEBUGOUTPUT
825+ fprintf (stderr , "Compare Vars:\n" );
826+ for (i = 0 ;i < ncmpvars ;i ++ )
827+ fprintf (stderr , "Var: %s\n" , cmpvars [i ]);
828+ #endif
829+
830+ /* get time */
831+ /*fprintf(stderr, "get time\n");*/
832+ timeVarName = getTimeVarName (allvars );
833+ timeVarNameRef = getTimeVarName (allvarsref );
834+ time = getData (timeVarName ,filename ,size ,suggestReadAll ,& simresglob_c ,0 );
835+ if (time .n == 0 ) {
836+ c_add_message (NULL ,-1 , ErrorType_scripting , ErrorLevel_error , gettext ("Error get time!" ), msg , 0 );
837+ return -1 ;
838+ }
839+ /*fprintf(stderr, "get reftime\n");*/
840+ timeref = getData (timeVarNameRef ,reffilename ,size_ref ,suggestReadAll ,& simresglob_ref ,0 );
841+ if (timeref .n == 0 ) {
842+ c_add_message (NULL ,-1 , ErrorType_scripting , ErrorLevel_error , gettext ("Error get reference time!" ), msg , 0 );
843+ return -1 ;
844+ }
845+
846+ /* check if time is larger or less reftime */
847+ if (time .data [0 ] > timeref .data [0 ]) {
848+ c_add_message (NULL ,-1 , ErrorType_scripting , ErrorLevel_error , gettext ("The result file starts before the reference file." ), msg , 0 );
849+ return -1 ;
850+ }
851+ if (time .data [time .n - 1 ] < timeref .data [timeref .n - 1 ]){
852+ c_add_message (NULL ,-1 , ErrorType_scripting , ErrorLevel_error , gettext ("The result file ends before the reference file." ), msg , 0 );
853+ return -1 ;
854+ }
855+
856+ /* calculate offsets */
857+ for (offset = 0 ; offset < time .n - 1 && time .data [offset ] == time .data [offset + 1 ]; ++ offset );
858+ for (offsetRef = 0 ; offsetRef < timeref .n - 1 && timeref .data [offsetRef ] == timeref .data [offsetRef + 1 ]; ++ offsetRef );
859+ var1 = NULL ;
860+ /* compare vars */
861+ /* fprintf(stderr, "compare vars\n"); */
862+ for (i = 0 ;i < ncmpvars ;i ++ ) {
863+ var = cmpvars [i ];
864+ len = strlen (var );
865+ if (var1 ) {
866+ free (var1 );
867+ var1 = NULL ;
868+ }
869+ var1 = (char * ) omc_alloc_interface .malloc (len + 10 );
870+ k = 0 ;
871+ for (j = 0 ;j < len ;j ++ ) {
872+ if (var [j ] != '\"' ) {
873+ var1 [k ] = var [j ];
874+ k += 1 ;
875+ }
876+ }
877+ var1 [k ] = 0 ;
878+ /* fprintf(stderr, "compare var: %s\n",var); */
879+ /* check if in ref_file */
880+ dataref = getData (var1 ,reffilename ,size_ref ,suggestReadAll ,& simresglob_ref ,0 );
881+ if (dataref .n == 0 ) {
882+ if (dataref .data ) {
883+ free (dataref .data );
884+ }
885+ if (var1 ) {
886+ GC_free (var1 );
887+ var1 = NULL ;
888+ }
889+ continue ;
890+ }
891+ /* check if in file */
892+ data = getData (var1 ,filename ,size ,suggestReadAll ,& simresglob_c ,0 );
893+ if (data .n == 0 ) {
894+ if (data .data ) {
895+ free (data .data );
896+ }
897+ if (var1 ) {
898+ GC_free (var1 );
899+ var1 = NULL ;
900+ }
901+ continue ;
902+ }
903+ /* adjust initial data points */
904+ for (j = offset ; j > 0 ; j -- )
905+ data .data [j - 1 ] = data .data [j ];
906+ for (j = offsetRef ; j > 0 ; j -- )
907+ dataref .data [j - 1 ] = dataref .data [j ];
908+
909+ /* calulate delta */
910+ res += deltaData (var ,& time ,& timeref ,& data ,& dataref );
911+
912+ /* free */
913+ if (dataref .data ) {
914+ free (dataref .data );
915+ }
916+ if (data .data ) {
917+ free (data .data );
918+ }
919+ if (var1 ) {
920+ GC_free (var1 );
921+ var1 = NULL ;
922+ }
923+ }
924+ if (cmpvars ) GC_free (cmpvars );
925+ if (time .data ) free (time .data );
926+ if (timeref .data ) free (timeref .data );
927+
928+ /* close files */
929+ SimulationResultsImpl__close (& simresglob_c );
930+ SimulationResultsImpl__close (& simresglob_ref );
931+ return res ;
932+ }
933+
0 commit comments