From b5c658782e92f5ac9e025a135441157e9c287cc9 Mon Sep 17 00:00:00 2001 From: Uwe Schulzweida <uwe.schulzweida@mpimet.mpg.de> Date: Sat, 11 Apr 2015 10:18:30 +0000 Subject: [PATCH] afterburnerlib: replaced streamWriteVar by streamWriteRecord --- src/afterburnerlib.c | 290 ++++++++++++++++++++++++------------------- 1 file changed, 163 insertions(+), 127 deletions(-) diff --git a/src/afterburnerlib.c b/src/afterburnerlib.c index b8f7f3548..bc2091c31 100644 --- a/src/afterburnerlib.c +++ b/src/afterburnerlib.c @@ -662,10 +662,15 @@ void after_processPL(struct Control *globs, struct Variable *vars) for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected ) { - if ( vars[code].spectral ) - streamWriteVar(globs->ostreamID, vars[code].ovarID, vars[code].spectral, 0); - else - Error("Code %d not available on spectral space!", code); + if ( ! vars[code].spectral ) Error("Code %d not available on spectral space!", code); + + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) + { + offset = lindex*globs->DimSP; + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].spectral+offset, 0); + } } FreeSpectral(vars); @@ -733,10 +738,15 @@ void after_processPL(struct Control *globs, struct Variable *vars) for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected ) { - if ( vars[code].fourier ) - streamWriteVar(globs->ostreamID, vars[code].ovarID, vars[code].fourier, 0); - else - Error("Code %d not available on fourier space!", code); + if ( ! vars[code].fourier ) Error("Code %d not available on fourier space!", code); + + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) + { + offset = lindex*globs->DimFC; + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].fourier+offset, 0); + } } FreeFourier(vars); @@ -752,17 +762,15 @@ void after_processPL(struct Control *globs, struct Variable *vars) for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected ) { - if ( vars[code].fourier ) + if ( ! vars[code].fourier ) Error("Code %d not available on zonal mean!", code); + + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) { - nlevel = zaxisInqSize(vars[code].ozaxisID); - for ( lindex = 0; lindex < nlevel; lindex++ ) - { - offset = lindex*globs->DimFC; - streamWriteVarSlice(globs->ostreamID, vars[code].ovarID, lindex, vars[code].fourier+offset, 0); - } - } - else - Error("Code %d not available on zonal mean!", code); + offset = lindex*globs->DimFC; + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].fourier+offset, 0); + } } FreeFourier(vars); @@ -888,10 +896,21 @@ void after_processPL(struct Control *globs, struct Variable *vars) for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected ) { - if ( globs->Mean != 2 ) - streamWriteVar(globs->ostreamID, vars[code].ovarID, vars[code].mean, vars[code].nmiss); - if ( globs->Mean >= 2 ) - streamWriteVar(globs->ostreamID2, vars[code].ovarID2, vars[code].variance, vars[code].nmiss); + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) + { + offset = lindex*globs->DimGP; + if ( globs->Mean != 2 ) + { + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].mean+offset, vars[code].nmiss); + } + if ( globs->Mean >= 2 ) + { + streamDefRecord(globs->ostreamID2, vars[code].ovarID2, lindex); + streamWriteRecord(globs->ostreamID2, vars[code].variance+offset, vars[code].nmiss); + } + } } FreeSamp(vars); @@ -907,7 +926,15 @@ void after_processPL(struct Control *globs, struct Variable *vars) { for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected ) - streamWriteVar(globs->ostreamID, vars[code].ovarID, vars[code].grid, vars[code].nmiss); + { + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) + { + offset = lindex*globs->DimGP; + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].grid+offset, vars[code].nmiss); + } + } FreeGrid(vars); return; @@ -1602,7 +1629,7 @@ void after_processML(struct Control *globs, struct Variable *vars) { int code,l,i; long fieldSize = 0; - int lindex, ilevel, nlevel; + int lindex, nlevel; int offset; int leveltype; int nmiss; @@ -1650,8 +1677,7 @@ void after_processML(struct Control *globs, struct Variable *vars) if ( vars[DIVERGENCE].spectral == NULL ) after_gp2sp(globs, vars, DIVERGENCE); - dv2ps(vars[DIVERGENCE].spectral, vars[VELOPOT].spectral, - vars[DIVERGENCE].hlev, globs->Truncation); + dv2ps(vars[DIVERGENCE].spectral, vars[VELOPOT].spectral, vars[DIVERGENCE].hlev, globs->Truncation); } if ( vars[STREAM].comp && globs->Type < 30 ) @@ -1681,24 +1707,15 @@ void after_processML(struct Control *globs, struct Variable *vars) for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected ) { - if ( vars[code].spectral ) + if ( ! vars[code].spectral ) Error("Code %d not available on spectral space!", code); + + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) { - leveltype = zaxisInqType(vars[code].ozaxisID); - if ( (leveltype == ZAXIS_HYBRID) && (vars[code].ozaxisID != vars[code].izaxisID) ) - { - nlevel = zaxisInqSize(vars[code].ozaxisID); - for ( lindex = 0; lindex < nlevel; lindex++ ) - { - ilevel = (int) zaxisInqLevel(vars[code].ozaxisID, lindex); - offset = (ilevel-1)*globs->DimSP; - streamWriteVarSlice(globs->ostreamID, vars[code].ovarID, lindex, vars[code].spectral+offset, 0); - } - } - else - streamWriteVar(globs->ostreamID, vars[code].ovarID, vars[code].spectral, 0); + offset = lindex*globs->DimSP; + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].spectral+offset, 0); } - else - Error("Code %d not available on spectral space!", code); } FreeSpectral(vars); @@ -1767,10 +1784,15 @@ void after_processML(struct Control *globs, struct Variable *vars) for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected ) { - if ( vars[code].fourier ) - streamWriteVar(globs->ostreamID, vars[code].ovarID, vars[code].fourier, 0); - else - Error("Code %d not available on fourier space!", code); + if ( ! vars[code].fourier ) Error("Code %d not available on fourier space!", code); + + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) + { + offset = lindex*globs->DimFC; + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].fourier+offset, 0); + } } FreeFourier(vars); @@ -1786,31 +1808,15 @@ void after_processML(struct Control *globs, struct Variable *vars) for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected ) { - if ( vars[code].fourier ) + if ( ! vars[code].fourier ) Error("Code %d not available on zonal mean!", code); + + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) { - leveltype = zaxisInqType(vars[code].ozaxisID); - if ( (leveltype == ZAXIS_HYBRID) && (vars[code].ozaxisID != vars[code].izaxisID) ) - { - nlevel = zaxisInqSize(vars[code].ozaxisID); - for ( lindex = 0; lindex < nlevel; lindex++ ) - { - ilevel = (int) zaxisInqLevel(vars[code].ozaxisID, lindex); - offset = (ilevel-1)*globs->DimFC; - streamWriteVarSlice(globs->ostreamID, vars[code].ovarID, lindex, vars[code].fourier+offset, 0); - } - } - else - { - nlevel = zaxisInqSize(vars[code].ozaxisID); - for ( lindex = 0; lindex < nlevel; lindex++ ) - { - offset = lindex*globs->DimFC; - streamWriteVarSlice(globs->ostreamID, vars[code].ovarID, lindex, vars[code].fourier+offset, 0); - } - } + offset = lindex*globs->DimFC; + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].fourier+offset, 0); } - else - Error("Code %d not available on zonal mean!", code); } FreeFourier(vars); @@ -1939,28 +1945,20 @@ void after_processML(struct Control *globs, struct Variable *vars) if ( vars[code].hybrid == NULL ) Error("Internal problem. Code %d not allocated!", code); - leveltype = zaxisInqType(vars[code].ozaxisID); - if ( (leveltype == ZAXIS_HYBRID) && (vars[code].ozaxisID != vars[code].izaxisID) ) + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) { - nlevel = zaxisInqSize(vars[code].ozaxisID); - for ( lindex = 0; lindex < nlevel; lindex++ ) + offset = lindex*globs->DimGP; + if ( globs->Mean != 2 ) { - ilevel = (int) zaxisInqLevel(vars[code].ozaxisID, lindex); - offset = (ilevel-1)*globs->DimGP; - if ( globs->Mean != 2 ) - streamWriteVarSlice(globs->ostreamID, vars[code].ovarID, lindex, - vars[code].hybrid+offset, vars[code].nmiss); - if ( globs->Mean >= 2 ) - streamWriteVarSlice(globs->ostreamID2, vars[code].ovarID2, lindex, - vars[code].variance+offset, vars[code].nmiss); + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].hybrid+offset, vars[code].nmiss); } - } - else - { - if ( globs->Mean != 2 ) - streamWriteVar(globs->ostreamID, vars[code].ovarID, vars[code].hybrid, vars[code].nmiss); if ( globs->Mean >= 2 ) - streamWriteVar(globs->ostreamID2, vars[code].ovarID2, vars[code].variance, vars[code].nmiss); + { + streamDefRecord(globs->ostreamID2, vars[code].ovarID2, lindex); + streamWriteRecord(globs->ostreamID2, vars[code].variance+offset, vars[code].nmiss); + } } } @@ -2061,9 +2059,18 @@ void after_processML(struct Control *globs, struct Variable *vars) for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected && vars[code].grid ) { - streamWriteVar(globs->ostreamID, vars[code].ovarID, vars[code].grid, vars[code].nmiss); + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) + { + offset = lindex*globs->DimGP; + if ( globs->Mean != 2 ) + { + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].grid+offset, vars[code].nmiss); + } + } } - + FreeGrid(vars); return; } @@ -2135,10 +2142,21 @@ void after_processML(struct Control *globs, struct Variable *vars) for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected && vars[code].mean ) { - if ( globs->Mean != 2 ) - streamWriteVar(globs->ostreamID, vars[code].ovarID, vars[code].mean, vars[code].nmiss); - if ( globs->Mean >= 2 ) - streamWriteVar(globs->ostreamID2, vars[code].ovarID2, vars[code].variance, vars[code].nmiss); + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) + { + offset = lindex*globs->DimGP; + if ( globs->Mean != 2 ) + { + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].mean+offset, vars[code].nmiss); + } + if ( globs->Mean >= 2 ) + { + streamDefRecord(globs->ostreamID2, vars[code].ovarID2, lindex); + streamWriteRecord(globs->ostreamID2, vars[code].variance+offset, vars[code].nmiss); + } + } } FreeSamp(vars); @@ -2200,10 +2218,15 @@ void after_processML(struct Control *globs, struct Variable *vars) for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected ) { - if ( vars[code].fourier ) - streamWriteVar(globs->ostreamID, vars[code].ovarID, vars[code].fourier, vars[code].nmiss); - else - Error("Code %d not available on fourier space!", code); + if ( ! vars[code].fourier ) Error("Code %d not available on fourier space!", code); + + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) + { + offset = lindex*globs->DimFC; + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].fourier+offset, vars[code].nmiss); + } } FreeFourier(vars); @@ -2219,17 +2242,15 @@ void after_processML(struct Control *globs, struct Variable *vars) for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected ) { - if ( vars[code].fourier ) + if ( ! vars[code].fourier ) Error("Code %d not available on zonal mean!", code); + + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) { - nlevel = zaxisInqSize(vars[code].ozaxisID); - for ( lindex = 0; lindex < nlevel; lindex++ ) - { - offset = lindex*globs->DimFC; - streamWriteVarSlice(globs->ostreamID, vars[code].ovarID, lindex, vars[code].fourier+offset, vars[code].nmiss); - } + offset = lindex*globs->DimFC; + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].fourier+offset, vars[code].nmiss); } - else - Error("Code %d not available on zonal mean!", code); } FreeFourier(vars); @@ -2310,7 +2331,13 @@ void after_processML(struct Control *globs, struct Variable *vars) for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected && vars[code].spectral ) { - streamWriteVar(globs->ostreamID, vars[code].ovarID, vars[code].spectral, vars[code].nmiss); + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) + { + offset = lindex*globs->DimSP; + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].spectral+offset, 0); + } } FreeSpectral(vars); @@ -2326,11 +2353,11 @@ void after_processML(struct Control *globs, struct Variable *vars) for (code = 0; code < MaxCodes; code++) if (vars[code].needed && vars[code].spectral) { - if (vars[code].fourier == NULL) { - fieldSize = vars[code].plev * globs->DimFC; - vars[code].fourier = alloc_dp(fieldSize, - FieldName(code,"fourier")); - } + if (vars[code].fourier == NULL) + { + fieldSize = vars[code].plev * globs->DimFC; + vars[code].fourier = alloc_dp(fieldSize, FieldName(code,"fourier")); + } sp2fc(vars[code].spectral,vars[code].fourier,globs->poli, vars[code].plev,globs->Latitudes,globs->Fouriers,globs->Truncation); } @@ -2351,10 +2378,15 @@ void after_processML(struct Control *globs, struct Variable *vars) for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected ) { - if ( vars[code].fourier ) - streamWriteVar(globs->ostreamID, vars[code].ovarID, vars[code].fourier, 0); - else - Error("Code %d not available on fourier space!", code); + if ( ! vars[code].fourier ) Error("Code %d not available on fourier space!", code); + + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) + { + offset = lindex*globs->DimFC; + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].fourier+offset, 0); + } } FreeFourier(vars); @@ -2370,17 +2402,15 @@ void after_processML(struct Control *globs, struct Variable *vars) for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected ) { - if ( vars[code].fourier ) + if ( ! vars[code].fourier ) Error("Code %d not available on zonal mean!", code); + + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) { - nlevel = zaxisInqSize(vars[code].ozaxisID); - for ( lindex = 0; lindex < nlevel; lindex++ ) - { - offset = lindex*globs->DimFC; - streamWriteVarSlice(globs->ostreamID, vars[code].ovarID, lindex, vars[code].fourier+offset, vars[code].nmiss); - } - } - else - Error("Code %d not available on zonal mean!", code); + offset = lindex*globs->DimFC; + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].fourier+offset, vars[code].nmiss); + } } FreeFourier(vars); @@ -2416,7 +2446,13 @@ void after_processML(struct Control *globs, struct Variable *vars) for ( code = 0; code < MaxCodes; code++ ) if ( vars[code].selected ) { - streamWriteVar(globs->ostreamID, vars[code].ovarID, vars[code].grid, vars[code].nmiss); + nlevel = zaxisInqSize(vars[code].ozaxisID); + for ( lindex = 0; lindex < nlevel; lindex++ ) + { + offset = lindex*globs->DimGP; + streamDefRecord(globs->ostreamID, vars[code].ovarID, lindex); + streamWriteRecord(globs->ostreamID, vars[code].grid+offset, vars[code].nmiss); + } } FreeSamp(vars); -- GitLab