flowchart v01 22 10 dkh - welcome to adjointadjoint.colorado.edu/~daven/gcadj_std/flowchart.pdf ·...

29
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

Upload: phamthu

Post on 08-Nov-2018

225 views

Category:

Documents


0 download

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

Function calls

Operation IF branch

Process File Macro

Step1 

Step2 

Shape & Color convention

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

DO_GEOS_CHEM

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

DO_CHEMISTRY

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)

LCARB  CHEMCARBON

LSULF 

CHEMDR

FULL_CHEM_SIM

CHEMSULFATE

LAERO_THERM  DO_RPMARES

DRYFLX DIAGOH

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

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

CALC_ADJ_FORCE_FOR_OBS

TES NH3 case

! 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