flowchart v01 22 10 dkh - welcome to adjointadjoint.colorado.edu/~daven/gcadj_std/flowchart.pdf ·...
TRANSCRIPT
GEOS‐Chem‐Adjoint‐V8
Flowchart descriptions of • Inverse_driver.f • Geos_chem_mod.f • Chemistry_mod.f • Chemdr.f • Geos_chem_adj.f
Meemong Lee
Jan/21, 2010
READ_INPUT_ADJ_FILE
INIT_SETULB INIT_INVERSE INIT_ADJ_ARRAYS
N_CALC_STOP == 0 ?
READ_INPUT_FILE
DO_GEOS_CHEM MAKE_SF_FILE
LADJ?
ITER N_CALC_STOP = ITER
Input.geos
Input.gcadj
Optimization Loop
SET_LOG_SF LOG_OPT? Y
N SET_SF
Y
N
Forward mode
CLOSE_FILES CLEANUP CLEANUP_ADJ
Inverse_driver.f
Log_opt
Log_opt
ITER = 0 : FWD only ITER = 1 : FWD + ADJ ITER >= 2 : Optimization loop + FWD + ADJ
Optimization loop iterates ‘ITER’ and increments it by one.
ITER ITER = N_CALC_STOP +1
Y
GET_X_FROM_SF
N
SETULB
TASK == ‘FG’?
TASK == ‘NEW_X’?
TASK == ‘STOP’?
Y
Y
ITERATE?
READ_GDT_FILE READ_CFN_FILE
LFDTEST & LICS
N_CALC < N_CALC_STOP
Y STT_ADJ_FD =ICS_SF_ADJ
COST_FUNC_SAVE(N_CALC) = COST_FUNC
GET_SF_FROM_X
GET_GRADNT_FROM_ADJ
N_CALC += 1
LFDTEST & LADJ_EMS STT_ADJ_FD =EMS_SF_ADJ
Exit
Optimization Loop
!LFDTEST || N_CALC_STOP == 1
SET_OPT_RANGE MAKE_GDT_FILE MAKE_SF_FILE MAKE_CFN_FILE
DO_GEOS_CHEM_ADJ
DO_GEOS_CHEM
LFDTEST && N_CALC > 1
N_CALC == 1
GET_SF_FROM_X
SET_SF_FORFD
Log_opt
N
Y
STT_ADJ_FD
SET_SF
MAKE_SAT_DIAG_FILE
N
N
GEOS_Chem_mod.f SET_DIRECTION(1)
AVGPOLE SET_FLOATING_PRESSURE AIRQNT RDLAND DO_PBL_MIX
LADJ
INIT_CHECKPT READ_RESTART_FILE APPLY_IC_SCALING
READ_RESTART_FILE
INITIALIZE PROCESS
OPEN/GET MET FIELDS
DYNAMIC TIME STEP Y
N
ARCHIVE DIAGNSTICS
CLEANUP & QUIT
COPY_I6_FIELDS
Restart File
Forward Loop
WRITE DIAGNOSTICS
READ MET FILES
INIT_DAO INITIALIZE(2) INITIALIZE(3) INIT_PRESSURE
!LVARTROP READ_TROPOPAUSE
LEMIS || LCHEM
ITS_A_FULLCHEM_SIM
INIT_COMOD
ITS_A_AEROSOL_SIM
INIT_COMOD
!LADJ INIT_GLOBAL_CH4
LMEGAN INIT_MEGAN INITIALIZE(2) INITIALIZE(3)
ITS_A_CH4_SIM
INITIALIZE PROCESS
Step1
Step2
Step3
Step4
LCHEM && NEW MONTH READ_UV_ALBEDO
UNZIP && TIME_FOR_UNZIP
UNZIP MET FIELDS
UNZIP && TIME_FOR_DEL
REMOVE MET FIELDS
READ MET FIELDS
ITS_Time_FOR_A3
ITS_Time_FOR_A6
ITS_Time_FOR_I6 COPY_I6_FIELDS_ADJ OPEN_I6_FIELDS_ADJ GET_I6_FIELDS_1_ADJ
OPEN_A6_FIELDS_ADJ READ_ A6_FIELDS_ADJ
OPEN_A3_FIELDS_ADJ GET_A3_FIELDS
Step1
Step2
Step3
Step4
Step5
Step6
FULL_CHEM_SIM || TAGCO_SIM
ANTHROEMS LEMIS && NEW_SEASON
DYNAMIC TIMESTEP
INTERPOLATE
DYNAMICS-FWD CONVECTION-FWD EMISSIONS-FWD
LUPBD DO_UPBDFLX
ITS_TIME_CHEM SET_CT_CHEM DO_CHEMISTRY
!LADJ && CH4_SIM CH4_AVGTP
LWETD && ITS_TIME_DYN
DO_WETDEP
Step1
Step2
Step3
Step4
Step5
Step6
Step7
LADJ DO_OUTPUT Step8
TIME_FOR_UNIT CONVERT_UNITS
LVARTROP CHECK_VAR_TROP
!LTRAN SET_FLOATING_PRESSURE
ND55 TROPOPAUSE
INTERP
AIRQNT COSSZA
SET_CT_DYN DIAG_2PM
NEW_DAY
LMEGAN RDISOLAI UPDATE_T_25_AVG
FULL_CHEM || H2HD_SIM
RDSOIL
RDLAI
INTERPOLATE Step1
Step2
Step3
Step4
Step5
Step6
Step7
Step8
ITS_Time_DYN Transport Zme
step = 30
LUPBD && FULL_CHEM_SIM
UPBDFLX_NOY(2)
LTRAN DO_TRANSPORT
AIRQNT
MAKE_RH
LCONV || LWETD || LSULF
INIT_WETSCAV
DYNAMICS-FWD
ITS_Time_CONV ConvecZon Zme
step = 30
LADJ CALL_CHK_CON_FILE Y
SET_CT_CONV DO_PBL_MIX
LCONV DO_CONVECTION Y
CONVECTION-FWD
ITS_Time_EMIS Emission Zme step = 60
LDRYD && H2HD_SIM DO_DRYDEP Y
SET_CT_CONV
LEMIS DO_EMISSION Y
EMISSION-FWD
A_CH3I_SIM
! A_CH4_SIM Y OPTDEPTH
AN_AEROSOL_SIM
A_RnPbBe_SIM
LADJ_CHEM
A_HCN_SIM
A_TAGCO_SIM
A_TAGOX_SIM
A_C2H6_SIM
A_CH4_SIM
A_MERCURY_SIM
A_H2HD_SIM
A_FULLCHEM_SIM
CHEMRnPbBe DRYFLXRnPbBe
CHEMCH31
CHEM_HCN_CH3CN
CHEM_TAGGED_OX
CHEM_TAGGED_CO_ADJ
CHEM_C2H6
CHEM_CH4
CHEM_MERCURY
CHEM_H2_HD DRYFLXH2HD
FULL_CHEM_SIM (next page+1 3
1
2
4
6
7
8
10
11
13
9
AEROSOL_SIM (next page)
chemistry_mod.f
FIRST READER READCHEM INPHOT
AEROSOL_SIM
AEROSOL_RURALBOX
AEROSOL_CONC RDAER
!LCRYST DO_RPMARESS
LSSALT CHEMSEASALT
LSULF or LCRYST CHEMSULFATE
LCARB CHEMCARBOM (organic)
LDUST CHEMDUST RDUST_ONLINE (SOILDUST)
LSULF | LCARB | LDUST | LSSALT
FIRSTCHEM
AEROSOL_CONC
INPHOT SETTRACE (LLRTOP, NPHOT) SETEMDEP (N_TRACERS)
READER READCHEM
CH4>0
MAKE_AVGW
GET_GLOBAL_CH4
INPHOT(LLTROP, NPHOT) SETTRACE SETEMDEP(N_TRACERS)
LSVCSPEC READ_CSPEC_FILE
GASCONC
SETEMIS(EMISRR, EMISRRN) RDAER FAST_J
PHYSPROC(SUNCOS, SUNCOSB) GCKPP_ADJ_DRIVER(forward)
LUMP DO_DIAG_OH
LDUST RDUST_ONLINE(SOILDUST)
RDUST_OFFLINE(SOILDUST)
LVARTROP | LSVCSPEC
SAVE_FULL_TROP
Y
N
chemdr.f
GEOS_Chem_adj.f SET_DIRECTION(-1)
INIT_WEIGHT
SET_CURRENT_TIME
READ MET FILES
MIN_ADJ > o
SET_ELAPSED_MIN_ADJ
SET_CURRENT_TIME
LOAD_CHECKPT_DATA
ITS_Time_OBS
CALC_ADJ_FORCE_FOR_OBS
ADJOINT PROCESS
CALC_APRIORI
RESCALE_ADJOINT
COSSZA
AIRQNT
DO_PBL_MIX
LAPSRC
MN_ADJ ‐= GET_TS_DYN()
EXIT
N N
N
Inverse Dynamic Loop MN_ADJ = FINAL‐ELAPSED‐TIME
LOG_RESCALE_ADJOINT
LOG_OPT N
ITS_Time_FOR_A3
ITS_Time_FOR_A6
ITS_Time_FOR_I6
LCHEM && New Month?
New Day?
COPY_I6_FIELDS_ADJ OPEN_I6_FIELDS_ADJ GET_I6_FIELDS_1_ADJ AVGPOLE
GET_A6_TIME_ADJ OPEN_A6_FIELDS_ADJ READ_ A6_FIELDS_ADJ
GET_A3_TIME_ADJ OPEN_A3_FIELDS_ADJ GET_A3_FIELDS
READ_UV_ALBEDO
RDISOLAI
Step1
Step2
Step3
Step4
Step5 FULLCHEMN_SIM || TAGCO_SIM
ANTHROEMS LADJ_EMS && New SEASON?
RDSOIL Step6
READ MET FILES
ITS_Time_CONV
ITS_Time_CHEM
ITS_Time_DYN
DO_CHEMISTRY_ADJ
CHECK_STT_ADJ DO_CONVECTION_ADJ CHECK_STT_ADJ
DO_PBL_MIX_ADJ
ITS_Time_EMIS DO_EMISSION_ADJ
ITS_Time_EMIS SET_CT_EMIS DO_DRYDEP DO_EMISSION
Step1
Step2
Step3
Step5
Step6
LCONV
LCONV || LWET || LCHEM || LSULF
ADJ_INIT_WETSCAV
LTRAN DO_TRANSPORT_ADJ
ADJOINT PROCESS
A_CH3I_SIM
! A_CH4_SIM Y OPTDEPTH
AN_AEROSOL_SIM
A_RnPbBe_SIM
LADJ_CHEM
A_HCN_SIM
A_TAGCO_SIM
A_TAGOX_SIM
A_C2H6_SIM
A_CH4_SIM
A_MERCURY_SIM
A_H2HD_SIM
A_FULLCHEM_SIM
CHEM_TAGGED_CO_ADJ
FULL_CHEM_SIM_ADJ (next page)
Not supported
3
1
2
4
6
7
8
10
11
13
9
chemistry_adj_mod.f
Not supported
Not supported
Not supported
Not supported
Not supported
Not supported
Not supported
Not supported
LCARB CHEMCARBON_ADJ
LSULF
CHEMDR_ADJ
FULL_CHEM_SIM_ADJ
CHEMSULFATE_ADJ
LAERO_THERM RECOMP_RPMARES DO_RPMARES_ADJ
LSSEALT
LDUST
LIDTACET/=0
Not supported
Not supported
Not supported
LSULF | LCARB | LDUST | LSSALT
FIRSTCHEM
MAKE_AVGW
SETEMIS(EMISRR, EMISRRN) RDAER FAST_J
PHYSPROC(SUNCOS, SUNCOSB)
Same as CHEMDR
Same as CHEMDR
GC_KPP_ADJ_DRIVER(inverse) CHECK_STT_ADJ
STT = CHK_STT_BEFCHEM
CSEP = CHK_CSPEC
PARTITION_ADJ CHECK_STT_ADJ
chemdr_adj.f
! Calculate the interpolation weight matrix MAP(1:LLPAR,1:LLNT) = GET_INTMAP( LLPAR, GC_PRES(:), GC_PSURF, LLNT, TES(NT)%PRES(1:LLNT), GC_PSURF )
! Get NH3 values at native model resolution GC_NH3_NATIVE(:) = CHK_STT(I,J,:,IDTNH3)
! Convert from kg/box to ppm GC_NH3_NATIVE(:) = GC_NH3_NATIVE(:) * TCVV(IDTNH3) / AD(I,J,:) * 1d6 NH3_SAVE(:,NT) = GC_NH3_NATIVE(:)
! Get NH3 values from doubled emissions run [ppmv] GC_NH3_NATIVE_DBL(:) = GET_DOUBLED_NH3( GET_NYMD(), GET_NHMS(), REAL(TES(NT)%LON,4), REAL(TES(NT)%LAT,4))
! Interpolate GC NH3 column to TES grid DO LL = 1, LLNT GC_NH3(LL) = 0d0 DO L = 1, LLPAR GC_NH3(LL) = GC_NH3(LL) + MAP(L,LL) * GC_NH3_NATIVE(L) ENDDO ENDDO
! Interpolate doubled GC NH3 column to TES grid DO LL = 1, LLNT GC_NH3_DBL(LL) = 0d0 DO L = 1, LLPAR GC_NH3_DBL(LL) = GC_NH3_DBL(LL) + MAP(L,LL) * GC_NH3_NATIVE_DBL(L) ENDDO ENDDO
CALC_ADJ_FORCE_FOR_OBS- 1/4
! x_m - x_a DO L = 1, LLNT GC_NH3(L) = MAX(GC_NH3(L), 1d-10) NH3_PERT(L) = LOG(GC_NH3(L)) - LOG(TES(NT)%PRIOR(L)) ENDDO
! x_a + A_k * ( x_m - x_a ) DO L = 1, LLNT NH3_HAT(L) = 0d0 DO LL = 1, LLNT NH3_HAT(L) = NH3_HAT(L) + TES(NT)%AVG_KERNEL(L,LL) * NH3_PERT(LL) ENDDO NH3_HAT(L) = NH3_HAT(L) + LOG(TES(NT)%PRIOR(L)) ENDDO
! x_m - x_a for doubled DO L = 1, LLNT GC_NH3_DBL(L) = MAX(GC_NH3_DBL(L), 1d-10) NH3_PERT_DBL(L) = LOG(GC_NH3_DBL(L)) - LOG(TES(NT)%PRIOR(L)) ENDDO
! x_a + A_k * ( x_m - x_a ) DO L = 1, LLNT NH3_HAT_DBL(L) = 0d0 DO LL = 1, LLNT NH3_HAT_DBL(L) = NH3_HAT_DBL(L) + TES(NT)%AVG_KERNEL(L,LL) * NH3_PERT_DBL(LL) ENDDO NH3_HAT_DBL(L) = NH3_HAT_DBL(L) + LOG(TES(NT)%PRIOR(L)) ENDDO
CALC_ADJ_FORCE_FOR_OBS- 2/4
! Calculate difference between modeled and observed profile DO L = 1, LLNT IF ( TES(NT)%NH3(L) > 0d0 ) THEN DIFF(L) = NH3_HAT(L) - LOG( TES(NT)%NH3(L) ) ELSE DIFF(L) = 0d0 ENDIF ENDDO
! Calculate 1/2 * DIFF^T * S_{obs}^{-1} * DIFF DO L = 1, LLNT FORCE(L) = 0d0 DO LL = 1, LLNT FORCE(L) = FORCE(L) + TES(NT)%OER_INV(L,LL) * DIFF(LL) ENDDO NEW_COST(NT) = NEW_COST(NT) + 0.5d0 * DIFF(L) * FORCE(L) ENDDO
! Adjoint of difference DO L = 1, LLNT IF ( TES(NT)%NH3(L) > 0d0 ) THEN ADJ_NH3_HAT(L) = ADJ_DIFF(L) ENDIF ENDDO
DO L = 1, LLNT ADJ_NH3_PERT(L) = 0d0 DO LL = 1, LLNT ADJ_NH3_PERT(L) = ADJ_NH3_PERT(L) + TES(NT)%AVG_KERNEL(LL,L) * ADJ_NH3_HAT(LL) ENDDO ENDDO
ADJ_DIFF = FORCE
CALC_ADJ_FORCE_FOR_OBS- 3/4
! Adjoint of x_m - x_a DO L = 1, LLNT IF ( GC_NH3(L) > 1d-10 ) THEN ADJ_GC_NH3(L) = 1d0 / GC_NH3(L) * ADJ_NH3_PERT(L) ELSE ADJ_GC_NH3(L) = 0d0 ENDIF ENDDO
! Adjoint of interpolation DO L = 1, LLPAR ADJ_GC_NH3_NATIVE(L) = 0d0 DO LL = 1, LLNT ADJ_GC_NH3_NATIVE(L) = ADJ_GC_NH3_NATIVE(L) + MAP(L,LL) * ADJ_GC_NH3(LL) ENDDO ENDDO
! Adjoint of unit conversion ADJ_GC_NH3_NATIVE(:) = ADJ_GC_NH3_NATIVE(:) * TCVV(IDTNH3) / AD(I,J,:) * 1d6 ! Pass adjoint back to adjoint tracer array STT_ADJ(I,J,:,IDTNH3) = STT_ADJ(I,J,:,IDTNH3) + ADJ_GC_NH3_NATIVE(:)
! Update cost function COST_FUNC = COST_FUNC + SUM(NEW_COST(NTSTOP:NTSTART))
CALC_ADJ_FORCE_FOR_OBS- 4/4
!AD = (dry) mass of air in grid box (I,J,L) in kg,
!TCVV = Array containing [Air MW / Tracer MW] for tracers