// Code reads SWAN Hs output and converts to fort.63 format. (The SWAN INPUT file is included as a refrence) // Also the parametric .63 files are compared to the SWAN results // in terms of Mean Absolute Error (MAE) and Normalized Mean // Absolute Error (NMAE), with outliers excluded. // The final output is a result file with the statistics as well // as an XLS .csv format for these results. // // MAKE SURE TO ADJUST NDSETSE TO MATCH NUMBER OF TIME STEPS // // By: Samuel Carter Boyd #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; int line=0; int x=0; int x1=0; int x2=0; int timestep=0; char content[10],temp1[10],temp2[10],content1[10],content2[10]; string s,s1,s2; int node_tot,dir_tot,node,k,k1,k2,direction,num_depths,headers,num_shared; double pi = 4*atan(1); bool check; double g=9.7918; //gravity at meanlat (28.1091 deg) double u,Hw; int di; int NDSETSE,NP,DTDP,NSPOOLGE,IRTYPE,TIME,IT; double residual_sum,RMSD_avg,RMSD_avg_sum,RMSD_avg_TOT,SI,SI_sum,SI_sum_TOT; double depth_cur,depth_prev,denominator,HwINTERP,DS,HsSWAN,H_PARAM,H_SWAN; double HsSWANavg,HsPARAMavg,DSavg; double DS_sum,num_skipped,HsPARAM_sum,HsSWAN_sum,MAE_sum,MAE_TOT,NMAE_sum,NMAE_TOT=0; double HsSWANavg_sum,HsPARAMavg_sum,DSavg_sum,HsPARAMavg_TOT,HsSWANavg_TOT,DSavg_TOT; double MAE[36],NMAE[36]; int time_skipped=0; double Savg[36]; double Pavg[36],MAEavg[36],NMAEavg[36]; int main(){ ifstream infile3; infile3.open("SWAN_const_U_30_Hs.txt"); //reading in SWAN Hs outputs ofstream outfile4("SWAN_Hs_const.63"); //creating fort.63 file for output NDSETSE=36; //number of outputs snapshots requested NP=126772; DTDP=1; NSPOOLGE=3600; IRTYPE=1; TIME=0; IT=1; outfile4<<"SWAN Generated Hs U="<<"VARYING Dir= 0(deg N)"<<" from Mesh.grd"<>content; HsSWAN=atof(content); if(HsSWAN==-9){ HsSWAN=-99999; } outfile4<1){ headers=1; } if(line>headers && line<=126772+headers){ //ignoring header lines stringstream ss1; ss1<>content1; while(!ss1.eof()){ //while values in the line (string ss1) ss1>>temp1; //read each value H_PARAM=atof(temp1); } stringstream ss2; ss2<>content2; while(!ss2.eof()){ //while values in the line (string ss2) ss2>>temp2; //read each value node=atof(content2); H_SWAN=atof(temp2); } //cout<<"H_PARAM: "<0 && H_SWAN>0){ //if both models have H values NOT being -99999 //cout< headers if(line==126772+headers){ //last value in a timestep HsSWANavg=HsSWAN_sum/num_shared; //each timestep avg HsPARAMavg=HsPARAM_sum/num_shared; DSavg=DS_sum/num_shared; MAE[timestep]=DSavg; NMAE[timestep]=100*(MAE[timestep]/HsSWANavg); RMSD_avg=pow((residual_sum/num_shared),0.5); SI=100*RMSD_avg/HsSWANavg; if(num_shared==0){ cout<<"NO NODES SHARED"<NDSETSE){ time_skipped=0; //to prevent error } HsSWANavg_sum=HsSWANavg_sum+HsSWANavg; //sum of AVGs for total simulation avg HsPARAMavg_sum=HsPARAMavg_sum+HsPARAMavg; DSavg_sum=DSavg_sum+DSavg; MAE_sum=MAE_sum+MAE[timestep]; NMAE_sum=NMAE_sum+NMAE[timestep]; RMSD_avg_sum=RMSD_avg_sum+RMSD_avg; SI_sum=SI_sum+SI; //total simulation averages Savg[timestep]=HsSWANavg; Pavg[timestep]=HsPARAMavg; //cout<<"timestep: "<NDSETSE){ //to prevent error time_skipped=0; } HsPARAMavg_TOT=HsPARAMavg_sum/(timestep-time_skipped); HsSWANavg_TOT=HsPARAMavg_sum/(timestep-time_skipped); DSavg_TOT=DSavg_sum/(timestep-time_skipped); MAE_TOT=MAE_sum/(timestep-time_skipped); NMAE_TOT=NMAE_sum/(timestep-time_skipped); RMSD_avg_TOT=RMSD_avg_sum/(timestep-time_skipped); SI_sum_TOT=SI_sum/(timestep-time_skipped); //sorting arrays for outlier investigation //outliers are found if they are outside the //inter-quartile range (for NMAE) sort(MAE, MAE + (NDSETSE-time_skipped)); sort(NMAE, NMAE + (NDSETSE-time_skipped)); int median_index=floor((NDSETSE-time_skipped)/2); int Q1_index=floor(median_index/2); int Q3_index=floor(median_index+(median_index/2)); double median=NMAE[median_index]; double Q1=NMAE[Q1_index]; double Q3=NMAE[Q3_index]; double IQR=Q3-Q1; double NMAE_stat[NDSETSE]; double MAE_stat[NDSETSE]; double Savg_stat[NDSETSE]; double Pavg_stat[NDSETSE]; int j=0; //used to count new array length without outliers cout<