update 20251007
This commit is contained in:
@ -283,11 +283,11 @@
|
|||||||
LOGICAL :: FIRST_WEAK
|
LOGICAL :: FIRST_WEAK
|
||||||
|
|
||||||
!=================================================================
|
!=================================================================
|
||||||
! GEOS-CHEM-ADJ starts here!
|
! GEOS-CHEM-ADJ starts here! 开始伴随过程
|
||||||
!=================================================================
|
!=================================================================
|
||||||
|
|
||||||
!=================================================================
|
!=================================================================
|
||||||
! ***** I N I T I A L I Z A T I O N *****
|
! ***** I N I T I A L I Z A T I O N ***** 初始化
|
||||||
!=================================================================
|
!=================================================================
|
||||||
|
|
||||||
!----------------------------------------------------------------------
|
!----------------------------------------------------------------------
|
||||||
@ -305,7 +305,7 @@
|
|||||||
WRITE( 6, '(a)' ) REPEAT( '=', 79 )
|
WRITE( 6, '(a)' ) REPEAT( '=', 79 )
|
||||||
WRITE( 6, '(a,/)' ) 'B A C K W A R D I N T E G R A T I O N'
|
WRITE( 6, '(a,/)' ) 'B A C K W A R D I N T E G R A T I O N'
|
||||||
|
|
||||||
! Now set DIRECTION to -1 to indicate that it's adjoint integration
|
! Now set DIRECTION to -1 to indicate that it's adjoint integration 设置积分的方向
|
||||||
CALL SET_DIRECTION( -1 )
|
CALL SET_DIRECTION( -1 )
|
||||||
|
|
||||||
! Initialize allocatable arrays
|
! Initialize allocatable arrays
|
||||||
@ -321,7 +321,7 @@
|
|||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
|
|
||||||
! Open BACKWD_met file
|
! Open BACKWD_met file 打开逆向的气象文件,里面就是一些描述信息倒是
|
||||||
CALL DISPLAY_MET(165,0)
|
CALL DISPLAY_MET(165,0)
|
||||||
|
|
||||||
! Define time variables for use below
|
! Define time variables for use below
|
||||||
@ -343,7 +343,7 @@
|
|||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
! BUG FIX: need to reset EMS_SF_ADJ so that gradients do not
|
! BUG FIX: need to reset EMS_SF_ADJ so that gradients do not
|
||||||
! accumulate from one iteration to the next. (zj, dkh, 07/30/10)
|
! accumulate from one iteration to the next. (zj, dkh, 07/30/10) 在每次迭代中重置了梯度的数组
|
||||||
IF ( LADJ_EMS ) EMS_SF_ADJ = 0D0
|
IF ( LADJ_EMS ) EMS_SF_ADJ = 0D0
|
||||||
|
|
||||||
! for new strat. chem. (hml, 08/09/11, adj32_025)
|
! for new strat. chem. (hml, 08/09/11, adj32_025)
|
||||||
@ -356,7 +356,7 @@
|
|||||||
IF ( LADJ_RRATE ) RATE_SF_ADJ = 0D0
|
IF ( LADJ_RRATE ) RATE_SF_ADJ = 0D0
|
||||||
|
|
||||||
!=================================================================
|
!=================================================================
|
||||||
! ***** 6 - H O U R T I M E S T E P L O O P *****
|
! ***** 6 - H O U R T I M E S T E P L O O P ***** 进行 6 小时的积分
|
||||||
!=================================================================
|
!=================================================================
|
||||||
|
|
||||||
! Echo message before first timestep
|
! Echo message before first timestep
|
||||||
@ -368,28 +368,28 @@
|
|||||||
|
|
||||||
! NSTEP is the number of dynamic timesteps w/in a 6-h interval
|
! NSTEP is the number of dynamic timesteps w/in a 6-h interval
|
||||||
! N_DYN_STEPS = 360 / GET_TS_DYN()
|
! N_DYN_STEPS = 360 / GET_TS_DYN()
|
||||||
! now with geos-fp (lzh, 07/10/2014)
|
! now with geos-fp (lzh, 07/10/2014) 计算需要计算的次数 N_DYN_STEPS
|
||||||
#if defined( GEOS_FP )
|
#if defined( GEOS_FP )
|
||||||
N_DYN_STEPS = 180 / GET_TS_DYN() ! GEOS-5.7.x has a 3-hr interval
|
N_DYN_STEPS = 180 / GET_TS_DYN() ! GEOS-5.7.x has a 3-hr interval
|
||||||
#else
|
#else
|
||||||
N_DYN_STEPS = 360 / GET_TS_DYN() ! All other met has a 6hr interval
|
N_DYN_STEPS = 360 / GET_TS_DYN() ! All other met has a 6hr interval
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FINAL_ELAPSED_MIN = GET_ELAPSED_MIN()
|
FINAL_ELAPSED_MIN = GET_ELAPSED_MIN() ! 获得程序运行的分钟数(?)应该不是指现实时间
|
||||||
|
|
||||||
! Start a new 6-h loop
|
! Start a new 6-h loop 开始迭代积分
|
||||||
DO
|
DO
|
||||||
|
|
||||||
! Get dynamic timestep in seconds
|
! Get dynamic timestep in seconds 获得积分时间
|
||||||
N_DYN = 60d0 * GET_TS_DYN()
|
N_DYN = 60d0 * GET_TS_DYN()
|
||||||
|
|
||||||
! Compute time parameters at start of 6-h loop
|
! Compute time parameters at start of 6-h loop 获取当前时间
|
||||||
CALL SET_CURRENT_TIME
|
CALL SET_CURRENT_TIME
|
||||||
|
|
||||||
!=================================================================
|
!=================================================================
|
||||||
! ***** D Y N A M I C T I M E S T E P L O O P *****
|
! ***** D Y N A M I C T I M E S T E P L O O P ***** 开始积分
|
||||||
!=================================================================
|
!=================================================================
|
||||||
DO MIN_ADJ = FINAL_ELAPSED_MIN - GET_TS_DYN(), 0, - GET_TS_DYN()
|
DO MIN_ADJ = FINAL_ELAPSED_MIN - GET_TS_DYN(), 0, - GET_TS_DYN() ! 从最后时刻反向积分到 0 时刻
|
||||||
|
|
||||||
! mak debug
|
! mak debug
|
||||||
WRITE(6,*)'start of adj time step'
|
WRITE(6,*)'start of adj time step'
|
||||||
@ -400,7 +400,7 @@
|
|||||||
! Compute & print time quantities at start of dyn step
|
! Compute & print time quantities at start of dyn step
|
||||||
CALL SET_CURRENT_TIME
|
CALL SET_CURRENT_TIME
|
||||||
|
|
||||||
! Set time variables for dynamic loop
|
! Set time variables for dynamic loop 获得时间参数
|
||||||
!DAY = GET_DAY()
|
!DAY = GET_DAY()
|
||||||
DAY_OF_YEAR = GET_DAY_OF_YEAR()
|
DAY_OF_YEAR = GET_DAY_OF_YEAR()
|
||||||
ELAPSED_SEC = GET_ELAPSED_SEC()
|
ELAPSED_SEC = GET_ELAPSED_SEC()
|
||||||
@ -413,7 +413,7 @@
|
|||||||
|
|
||||||
!CALL MAKE_ADJOINT_CHKFILE( NYMD, NHMS, TAU )
|
!CALL MAKE_ADJOINT_CHKFILE( NYMD, NHMS, TAU )
|
||||||
|
|
||||||
! Get info from the perturbed forward run
|
! Get info from the perturbed forward run 从前向模拟中获得相关信息和数据,输入的是时间
|
||||||
CALL LOAD_CHECKPT_DATA( NYMD, NHMS )
|
CALL LOAD_CHECKPT_DATA( NYMD, NHMS )
|
||||||
|
|
||||||
! mkeller: weak constraint stuff
|
! mkeller: weak constraint stuff
|
||||||
@ -428,7 +428,7 @@
|
|||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
!============================================================
|
!============================================================
|
||||||
! ***** R E A D M E T F I E L D S *****
|
! ***** R E A D M E T F I E L D S ***** 读取气象场数据
|
||||||
!============================================================
|
!============================================================
|
||||||
! If it is the first time through, we will use i6 field from the
|
! If it is the first time through, we will use i6 field from the
|
||||||
! forward calculation, and all we need to do is set NSECb_ADJ
|
! forward calculation, and all we need to do is set NSECb_ADJ
|
||||||
@ -474,7 +474,7 @@
|
|||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
!==============================================================
|
!==============================================================
|
||||||
! ***** R E A D I - 6 F I E L D S *****
|
! ***** R E A D I - 6 F I E L D S ***** 读取 I6 场
|
||||||
!==============================================================
|
!==============================================================
|
||||||
!!! geos-fp (lzh, 07/10/2014)
|
!!! geos-fp (lzh, 07/10/2014)
|
||||||
#if defined( GEOS_FP )
|
#if defined( GEOS_FP )
|
||||||
@ -502,8 +502,8 @@
|
|||||||
! Compute avg pressure at polar caps (for ADJ argument is PS1, not PS2)
|
! Compute avg pressure at polar caps (for ADJ argument is PS1, not PS2)
|
||||||
CALL AVGPOLE( PS1 )
|
CALL AVGPOLE( PS1 )
|
||||||
|
|
||||||
! Set NSECb_ADJ to be used for the interpolation
|
! Set NSECb_ADJ to be used for the interpolation 这个参数是用来插值的
|
||||||
! where NSECb_ADJ is the total elapsed time in seconds at the
|
! where NSECb_ADJ is the total elapsed time in seconds at the 表示从当前 6 小时时间步开始的秒钟数
|
||||||
! beginning of the current 6h time step which contains ELAPSED_MIN
|
! beginning of the current 6h time step which contains ELAPSED_MIN
|
||||||
NSECb_ADJ = ( MIN_ADJ + GET_TS_DYN() ) * 60 - 3 * 3600
|
NSECb_ADJ = ( MIN_ADJ + GET_TS_DYN() ) * 60 - 3 * 3600
|
||||||
ENDIF
|
ENDIF
|
||||||
@ -524,9 +524,9 @@
|
|||||||
! Get the date/time for the previous I-6 data block
|
! Get the date/time for the previous I-6 data block
|
||||||
BEHIND_DATE = GET_I6_TIME_ADJ()
|
BEHIND_DATE = GET_I6_TIME_ADJ()
|
||||||
|
|
||||||
! Open and read files
|
! Open and read files 虽然是打开了气象场文件,但不确定是正向模拟使用的还是专用于伴随的,程序是专用于伴随的
|
||||||
CALL OPEN_I6_FIELDS_ADJ( BEHIND_DATE(1), BEHIND_DATE(2) )
|
CALL OPEN_I6_FIELDS_ADJ( BEHIND_DATE(1), BEHIND_DATE(2) )
|
||||||
CALL GET_I6_FIELDS_1_ADJ( BEHIND_DATE(1), BEHIND_DATE(2) )
|
CALL GET_I6_FIELDS_1_ADJ( BEHIND_DATE(1), BEHIND_DATE(2) ) ! 从这边看应该是读取的原始气象场
|
||||||
PRINT*,'I6 DATE = ',BEHIND_DATE(1),BEHIND_DATE(2)
|
PRINT*,'I6 DATE = ',BEHIND_DATE(1),BEHIND_DATE(2)
|
||||||
|
|
||||||
! Compute avg pressure at polar caps (for ADJ argument is PS1, not PS2)
|
! Compute avg pressure at polar caps (for ADJ argument is PS1, not PS2)
|
||||||
@ -608,7 +608,7 @@
|
|||||||
CALL GET_A3_FIELDS( BEHIND_DATE(1), BEHIND_DATE(2) )
|
CALL GET_A3_FIELDS( BEHIND_DATE(1), BEHIND_DATE(2) )
|
||||||
|
|
||||||
! Update daily mean temperature archive for MEGAN biogenics
|
! Update daily mean temperature archive for MEGAN biogenics
|
||||||
! For adjoint, read in checkpointed values (dkh, 01/23/10)
|
! For adjoint, read in checkpointed values (dkh, 01/23/10) 对于伴随来说,则是将气象场读入检查点值
|
||||||
IF ( LMEGAN ) CALL UPDATE_T_DAY_ADJ
|
IF ( LMEGAN ) CALL UPDATE_T_DAY_ADJ
|
||||||
|
|
||||||
#if defined( GEOS_3 )
|
#if defined( GEOS_3 )
|
||||||
@ -625,7 +625,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
!DAY_OF_SIM initialized to -1 in INIT_ADJ_ARRAYS
|
!DAY_OF_SIM initialized to -1 in INIT_ADJ_ARRAYS
|
||||||
! keeps tabs of day of simulation, going backward in time
|
! keeps tabs of day of simulation, going backward in time 确保模拟是反向运行的
|
||||||
! this is handy for storing diagnostic files that have dimensions
|
! this is handy for storing diagnostic files that have dimensions
|
||||||
! (IIPAR,JJPAR,DAYS), where DAYS is number of days in simulation
|
! (IIPAR,JJPAR,DAYS), where DAYS is number of days in simulation
|
||||||
! (adj_group, 6/09/09)
|
! (adj_group, 6/09/09)
|
||||||
@ -649,7 +649,7 @@
|
|||||||
|
|
||||||
|
|
||||||
!==============================================================
|
!==============================================================
|
||||||
! ***** M O N T H L Y O R S E A S O N A L D A T A *****
|
! ***** M O N T H L Y O R S E A S O N A L D A T A ***** 月度或者季节数据
|
||||||
!==============================================================
|
!==============================================================
|
||||||
|
|
||||||
! UV albedoes
|
! UV albedoes
|
||||||
@ -668,7 +668,7 @@
|
|||||||
|
|
||||||
|
|
||||||
!==============================================================
|
!==============================================================
|
||||||
! ***** D A I L Y D A T A *****
|
! ***** D A I L Y D A T A ***** 读取每日的数据
|
||||||
!
|
!
|
||||||
! RDLAI returns today's leaf-area index
|
! RDLAI returns today's leaf-area index
|
||||||
! RDSOIL returns today's soil type information
|
! RDSOIL returns today's soil type information
|
||||||
@ -726,7 +726,7 @@
|
|||||||
! ***** I N T E R P O L A T E Q U A N T I T I E S *****
|
! ***** I N T E R P O L A T E Q U A N T I T I E S *****
|
||||||
!
|
!
|
||||||
! Interpolate I-6 fields to current dynamic timestep,
|
! Interpolate I-6 fields to current dynamic timestep,
|
||||||
! based on their values at NSEC and NSEC+NTDT
|
! based on their values at NSEC and NSEC+NTDT 将气象场数据插值到当前时刻
|
||||||
!==============================================================
|
!==============================================================
|
||||||
|
|
||||||
#if defined ( GEOS_3 )
|
#if defined ( GEOS_3 )
|
||||||
@ -739,11 +739,11 @@
|
|||||||
ENDIF
|
ENDIF
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
! If we are not doing transport, then make sure that
|
! If we are not doing transport, then make sure that 为什么会有不做传输的选项啊
|
||||||
! the floating pressure is set to PSC2 (bdf, bmy, 8/22/02)
|
! the floating pressure is set to PSC2 (bdf, bmy, 8/22/02)
|
||||||
IF ( .not. LTRAN ) CALL SET_FLOATING_PRESSURE( PSC2 )
|
IF ( .not. LTRAN ) CALL SET_FLOATING_PRESSURE( PSC2 )
|
||||||
|
|
||||||
! Compute airmass quantities at each grid box
|
! Compute airmass quantities at each grid box 计算每个网格的空气质量
|
||||||
CALL AIRQNT
|
CALL AIRQNT
|
||||||
|
|
||||||
! OLD:
|
! OLD:
|
||||||
@ -2721,7 +2721,7 @@
|
|||||||
!
|
!
|
||||||
!******************************************************************************
|
!******************************************************************************
|
||||||
! Subroutine CALC_ADJ_FORCE_FOR_SENS calculates the cost function for
|
! Subroutine CALC_ADJ_FORCE_FOR_SENS calculates the cost function for
|
||||||
! sensitivity calculations. (dkh, ks, mak, cs 06/08/09)
|
! sensitivity calculations. (dkh, ks, mak, cs 06/08/09) 用于敏感性计算的程序
|
||||||
!
|
!
|
||||||
! NOTE:
|
! NOTE:
|
||||||
! (1 ) Split off from CALC_ADJ_FORCE (dkh, ks, mak, cs 06/08/09)
|
! (1 ) Split off from CALC_ADJ_FORCE (dkh, ks, mak, cs 06/08/09)
|
||||||
@ -3387,7 +3387,7 @@
|
|||||||
!
|
!
|
||||||
!******************************************************************************
|
!******************************************************************************
|
||||||
! Subroutine LOAD_CHECKPT_DATA reads in information stored during the forward
|
! Subroutine LOAD_CHECKPT_DATA reads in information stored during the forward
|
||||||
! calculation. Some of the data (CSPEC) needs to be rotated.
|
! calculation. Some of the data (CSPEC) needs to be rotated. 读取前向模型的相关数据,某些数据可能需要转置
|
||||||
! (dkh, 08/10/05)
|
! (dkh, 08/10/05)
|
||||||
!
|
!
|
||||||
! Arguments as Input:
|
! Arguments as Input:
|
||||||
@ -3468,7 +3468,7 @@
|
|||||||
! LOAD_CHECKPT_DATA begins here!
|
! LOAD_CHECKPT_DATA begins here!
|
||||||
!=================================================================
|
!=================================================================
|
||||||
|
|
||||||
! Load the TMP met fields so they can rotate in later.
|
! Load the TMP met fields so they can rotate in later. 设置了一些临时变量
|
||||||
IF ( FIRST ) THEN
|
IF ( FIRST ) THEN
|
||||||
SLP_TMP(:,:) = SLP(:,:)
|
SLP_TMP(:,:) = SLP(:,:)
|
||||||
#if defined( GEOS_3 ) || defined( GEOS_4 ) || defined( GEOS_5 ) || defined(GEOS_FP)
|
#if defined( GEOS_3 ) || defined( GEOS_4 ) || defined( GEOS_5 ) || defined(GEOS_FP)
|
||||||
@ -3481,26 +3481,26 @@
|
|||||||
FIRST = .FALSE.
|
FIRST = .FALSE.
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
IF ( ITS_TIME_FOR_CHEM() ) THEN
|
IF ( ITS_TIME_FOR_CHEM() ) THEN ! 如果是需要计算化学过程
|
||||||
|
|
||||||
! Rotate arrays for fullchem
|
! Rotate arrays for fullchem
|
||||||
IF ( ITS_A_FULLCHEM_SIM() ) THEN
|
IF ( ITS_A_FULLCHEM_SIM() ) THEN ! 如果全化学模拟
|
||||||
|
|
||||||
IF ( TURNAROUND .and. IDO3 /= 0 .and. IDNO2 /=0 ) THEN
|
IF ( TURNAROUND .and. IDO3 /= 0 .and. IDNO2 /=0 ) THEN ! 如果包含 O3 和 NO2?
|
||||||
|
|
||||||
! Added in v16 (dkh, 08/27/06)
|
! Added in v16 (dkh, 08/27/06)
|
||||||
! Get directly from CSPEC the first time
|
! Get directly from CSPEC the first time
|
||||||
!$OMP PARALLEL DO
|
!$OMP PARALLEL DO
|
||||||
!$OMP+DEFAULT( SHARED )
|
!$OMP+DEFAULT( SHARED )
|
||||||
!$OMP+PRIVATE( JLOOP, N, IDCSPEC )
|
!$OMP+PRIVATE( JLOOP, N, IDCSPEC )
|
||||||
DO JLOOP = 1, ITLOOP
|
DO JLOOP = 1, ITLOOP ! 对?迭代
|
||||||
DO N = 1, NOBS_CSPEC
|
DO N = 1, NOBS_CSPEC ! 对所有化学物种迭代
|
||||||
|
|
||||||
IDCSPEC = IDCSPEC_ADJ(N)
|
IDCSPEC = IDCSPEC_ADJ(N) ! 获取对应的 ID
|
||||||
! Now make this more general (dkh, 02/09/11)
|
! Now make this more general (dkh, 02/09/11)
|
||||||
!O3_AFTER_CHEM(JLOOP) = CSPEC(JLOOP,IDO3)
|
!O3_AFTER_CHEM(JLOOP) = CSPEC(JLOOP,IDO3)
|
||||||
!NO2_AFTER_CHEM(JLOOP) = CSPEC(JLOOP,IDNO2)
|
!NO2_AFTER_CHEM(JLOOP) = CSPEC(JLOOP,IDNO2)
|
||||||
CSPEC_AFTER_CHEM(JLOOP,N) = CSPEC(JLOOP,IDCSPEC)
|
CSPEC_AFTER_CHEM(JLOOP,N) = CSPEC(JLOOP,IDCSPEC) ! 大概是 ID 和 迭代的对应?
|
||||||
|
|
||||||
ENDDO
|
ENDDO
|
||||||
ENDDO
|
ENDDO
|
||||||
@ -3534,13 +3534,13 @@
|
|||||||
!$OMP END PARALLEL DO
|
!$OMP END PARALLEL DO
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
! Turnaround will be false after the first time through this routine
|
! Turnaround will be false after the first time through this routine 在第一次运行后,ID 获取的来源就环卫 CHK_CSPEC
|
||||||
TURNAROUND = .FALSE.
|
TURNAROUND = .FALSE.
|
||||||
|
|
||||||
ENDIF ! fullchem
|
ENDIF ! fullchem
|
||||||
|
|
||||||
! Read data from file
|
! Read data from file
|
||||||
CALL READ_CHECKPT_FILE ( NYMD, NHMS )
|
CALL READ_CHECKPT_FILE ( NYMD, NHMS ) ! 读取检查点文件
|
||||||
|
|
||||||
IF ( ITS_A_FULLCHEM_SIM() .AND. LCHEM ) THEN
|
IF ( ITS_A_FULLCHEM_SIM() .AND. LCHEM ) THEN
|
||||||
|
|
||||||
|
@ -2424,10 +2424,10 @@
|
|||||||
!******************************************************************************
|
!******************************************************************************
|
||||||
! Subroutine DISPLAY_MET writes out met field and computed data to the
|
! Subroutine DISPLAY_MET writes out met field and computed data to the
|
||||||
! screen, used for checking that the fwd and backwd runs are in sync.
|
! screen, used for checking that the fwd and backwd runs are in sync.
|
||||||
! (dkh, 03/13/05)
|
! (dkh, 03/13/05) 输出气象文件,并且计算,保证正向的和逆向的运行一致?
|
||||||
!
|
!
|
||||||
! NOTES:
|
! NOTES:
|
||||||
! (1 ) Use FID = 155 for fwd run and FID = 165 for backwd run
|
! (1 ) Use FID = 155 for fwd run and FID = 165 for backwd run 155 是正向运行的,165 是逆向运行的,主要是决定了使用的文件名
|
||||||
!
|
!
|
||||||
!******************************************************************************
|
!******************************************************************************
|
||||||
!
|
!
|
||||||
@ -2474,7 +2474,7 @@
|
|||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
IF ( LOCATION == 0 ) THEN
|
IF ( LOCATION == 0 ) THEN
|
||||||
! Open files for output
|
! Open files for output 打开输出文件,写入当前的坐标信息?
|
||||||
OPEN( FID, FILE=TRIM( FILENAME ), STATUS='UNKNOWN',
|
OPEN( FID, FILE=TRIM( FILENAME ), STATUS='UNKNOWN',
|
||||||
& IOSTAT=IOS, FORM='FORMATTED', ACCESS='SEQUENTIAL' )
|
& IOSTAT=IOS, FORM='FORMATTED', ACCESS='SEQUENTIAL' )
|
||||||
|
|
||||||
@ -2493,9 +2493,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
ELSEIF ( LOCATION == 1 ) THEN
|
ELSEIF ( LOCATION == 1 ) THEN
|
||||||
! Hours since start of run
|
! Hours since start of run 也就是正向模拟运行的过程
|
||||||
|
|
||||||
! Write quantities
|
! Write quantities 写入一些当前时间的量,感觉这个文件主要是包含了一堆描述信息?
|
||||||
WRITE( FID, 100 ) GET_YEAR(), GET_MONTH(), GET_DAY(),
|
WRITE( FID, 100 ) GET_YEAR(), GET_MONTH(), GET_DAY(),
|
||||||
& GET_HOUR(), GET_MINUTE()
|
& GET_HOUR(), GET_MINUTE()
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
!=================================================================
|
!=================================================================
|
||||||
|
|
||||||
! Parameters
|
! Parameters
|
||||||
INTEGER, PARAMETER :: LLGEOCAPE = 13
|
INTEGER, PARAMETER :: LLGEOCAPE = 13 ! 卫星观测的垂直层数
|
||||||
INTEGER, PARAMETER :: MAXGEOCAPE = 639059
|
INTEGER, PARAMETER :: MAXGEOCAPE = 639059
|
||||||
|
|
||||||
|
|
||||||
@ -25,7 +25,7 @@
|
|||||||
REAL*8 :: TOTERROR_INV( LLGEOCAPE, LLGEOCAPE )
|
REAL*8 :: TOTERROR_INV( LLGEOCAPE, LLGEOCAPE )
|
||||||
REAL*8 :: PRESSURE( LLGEOCAPE )
|
REAL*8 :: PRESSURE( LLGEOCAPE )
|
||||||
REAL*8 :: PRESSURE_EDGE( LLGEOCAPE )
|
REAL*8 :: PRESSURE_EDGE( LLGEOCAPE )
|
||||||
REAL*8 :: RANDNUM( MAXGEOCAPE )
|
REAL*8 :: RANDNUM( MAXGEOCAPE ) ! 保存了随机数的数组
|
||||||
|
|
||||||
|
|
||||||
CONTAINS
|
CONTAINS
|
||||||
@ -37,7 +37,7 @@
|
|||||||
! Subroutine READ_GEOCAPE_INFO reads and stores information about the new
|
! Subroutine READ_GEOCAPE_INFO reads and stores information about the new
|
||||||
! instrument, specifically AK, pressure levels and error covariance matrices.
|
! instrument, specifically AK, pressure levels and error covariance matrices.
|
||||||
! (kjw, 07/24/11)
|
! (kjw, 07/24/11)
|
||||||
!
|
! 用于读取卫星观测的数据,保存 AK、气压以及误差协方差矩阵(没有观测值么),应该有观测值
|
||||||
! Arguments as Input:
|
! Arguments as Input:
|
||||||
! ============================================================================
|
! ============================================================================
|
||||||
! (1 ) FILENAME (CHAR) : GEOCAPE filename to read
|
! (1 ) FILENAME (CHAR) : GEOCAPE filename to read
|
||||||
@ -85,7 +85,7 @@
|
|||||||
|
|
||||||
! Read and store one variable at a time
|
! Read and store one variable at a time
|
||||||
|
|
||||||
! ------ Averaging Kernel Matrix ------
|
! ------ Averaging Kernel Matrix ------ 读取平均核函数,并保存在模块变量中
|
||||||
! Filename to read
|
! Filename to read
|
||||||
READ_FILENAME = TRIM( '/home/kjw/new_satellites/geocape/' ) //
|
READ_FILENAME = TRIM( '/home/kjw/new_satellites/geocape/' ) //
|
||||||
& 'data/' // TRIM( 'geocape_AK.txt' )
|
& 'data/' // TRIM( 'geocape_AK.txt' )
|
||||||
@ -116,7 +116,7 @@
|
|||||||
CLOSE( IU_IN )
|
CLOSE( IU_IN )
|
||||||
|
|
||||||
|
|
||||||
! ------ Observation Error Covariance Matrix ------
|
! ------ Observation Error Covariance Matrix ------ 读取误差协方差矩阵
|
||||||
! Filename to read
|
! Filename to read
|
||||||
READ_FILENAME = TRIM( '/home/kjw/new_satellites/geocape/' ) //
|
READ_FILENAME = TRIM( '/home/kjw/new_satellites/geocape/' ) //
|
||||||
& 'data/' // TRIM( 'geocape_obs_error.txt' )
|
& 'data/' // TRIM( 'geocape_obs_error.txt' )
|
||||||
@ -129,7 +129,7 @@
|
|||||||
& STATUS='OLD', IOSTAT=IOS )
|
& STATUS='OLD', IOSTAT=IOS )
|
||||||
IF ( IOS /= 0 ) CALL IOERROR( IOS, IU_IN, 'read_obs_error:1' )
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IU_IN, 'read_obs_error:1' )
|
||||||
|
|
||||||
! Read File and save info into module variable OBSERROR(:,:)
|
! Read File and save info into module variable OBSERROR(:,:) 读取观测误差
|
||||||
DO LN=1,LLGEOCAPE
|
DO LN=1,LLGEOCAPE
|
||||||
READ( IU_IN, '(13F18.12)', IOSTAT=IOS ) OBSERROR(LN,:)
|
READ( IU_IN, '(13F18.12)', IOSTAT=IOS ) OBSERROR(LN,:)
|
||||||
|
|
||||||
@ -147,7 +147,7 @@
|
|||||||
CLOSE( IU_IN )
|
CLOSE( IU_IN )
|
||||||
|
|
||||||
|
|
||||||
! ------ Inverse of Observation Error Covariance Matrix ------
|
! ------ Inverse of Observation Error Covariance Matrix ------ 对观测误差协方差矩阵求逆
|
||||||
! Filename to read
|
! Filename to read
|
||||||
READ_FILENAME = TRIM( '/home/kjw/new_satellites/geocape/' ) //
|
READ_FILENAME = TRIM( '/home/kjw/new_satellites/geocape/' ) //
|
||||||
& 'data/' // TRIM( 'geocape_obs_error_inv.txt' )
|
& 'data/' // TRIM( 'geocape_obs_error_inv.txt' )
|
||||||
@ -209,7 +209,7 @@
|
|||||||
! CLOSE( IU_IN )
|
! CLOSE( IU_IN )
|
||||||
|
|
||||||
|
|
||||||
! ------ Pressure Levels ------
|
! ------ Pressure Levels ------ 读取气压数据
|
||||||
! Filename to read
|
! Filename to read
|
||||||
READ_FILENAME = TRIM( '/home/kjw/new_satellites/geocape/' ) //
|
READ_FILENAME = TRIM( '/home/kjw/new_satellites/geocape/' ) //
|
||||||
& 'data/' // TRIM( 'geocape_pressure.txt' )
|
& 'data/' // TRIM( 'geocape_pressure.txt' )
|
||||||
@ -238,7 +238,7 @@
|
|||||||
CLOSE( IU_IN )
|
CLOSE( IU_IN )
|
||||||
|
|
||||||
|
|
||||||
! ------ Pressure Edges ------
|
! ------ Pressure Edges ------ 获取气压的边界值
|
||||||
! By finite difference on log(pressure) grid
|
! By finite difference on log(pressure) grid
|
||||||
PRESSURE_EDGE(1) = PRESSURE(1)
|
PRESSURE_EDGE(1) = PRESSURE(1)
|
||||||
PRESSURE_EDGE(LLGEOCAPE) = 0.
|
PRESSURE_EDGE(LLGEOCAPE) = 0.
|
||||||
@ -248,7 +248,7 @@
|
|||||||
ENDDO
|
ENDDO
|
||||||
|
|
||||||
|
|
||||||
! Return to calling program
|
! Return to calling program 还真没有直接读取观测值
|
||||||
END SUBROUTINE READ_GEOCAPE_INFO
|
END SUBROUTINE READ_GEOCAPE_INFO
|
||||||
!------------------------------------------------------------------------------
|
!------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -258,7 +258,7 @@
|
|||||||
!******************************************************************************
|
!******************************************************************************
|
||||||
! Subroutine CALC_GEOCAPE_CH4_FORCE calculates the adjoint forcing from the GEOCAPE
|
! Subroutine CALC_GEOCAPE_CH4_FORCE calculates the adjoint forcing from the GEOCAPE
|
||||||
! CH4 observations and updates the cost function. (kjw, 07/20/11)
|
! CH4 observations and updates the cost function. (kjw, 07/20/11)
|
||||||
!
|
! 该程序计算伴随强迫,并且更新代价函数
|
||||||
!
|
!
|
||||||
! Arguments as Input/Output:
|
! Arguments as Input/Output:
|
||||||
! ============================================================================
|
! ============================================================================
|
||||||
@ -362,10 +362,10 @@
|
|||||||
NEW_COST(:) = 0d0
|
NEW_COST(:) = 0d0
|
||||||
|
|
||||||
|
|
||||||
! Open files for output
|
! Open files for output 在第一次运行时会打开相关文件用于输出(?)
|
||||||
IF ( FIRST ) THEN
|
IF ( FIRST ) THEN
|
||||||
FILENAME = 'pres.NN.m'
|
FILENAME = 'pres.NN.m'
|
||||||
CALL EXPAND_NAME( FILENAME, N_CALC )
|
CALL EXPAND_NAME( FILENAME, N_CALC ) ! 替换文件名中的 NN 为迭代次数
|
||||||
FILENAME = TRIM( DIAGADJ_DIR ) // TRIM( FILENAME )
|
FILENAME = TRIM( DIAGADJ_DIR ) // TRIM( FILENAME )
|
||||||
OPEN( 101, FILE=TRIM( FILENAME ), STATUS='UNKNOWN',
|
OPEN( 101, FILE=TRIM( FILENAME ), STATUS='UNKNOWN',
|
||||||
& IOSTAT=IOS, FORM='FORMATTED', ACCESS='SEQUENTIAL' )
|
& IOSTAT=IOS, FORM='FORMATTED', ACCESS='SEQUENTIAL' )
|
||||||
@ -471,11 +471,11 @@
|
|||||||
!FILENAME_OBS = TRIM( ADJTMP_DIR ) // TRIM( FILENAME_OBS )
|
!FILENAME_OBS = TRIM( ADJTMP_DIR ) // TRIM( FILENAME_OBS )
|
||||||
XTAU = GET_TAU()
|
XTAU = GET_TAU()
|
||||||
CALL READ_BPCH2( TRIM(FILENAME_OBS), 'IJ-OBS-$', 1,
|
CALL READ_BPCH2( TRIM(FILENAME_OBS), 'IJ-OBS-$', 1,
|
||||||
& XTAU, IIPAR, JJPAR,
|
& XTAU, IIPAR, JJPAR, ! II, JJ, LL 都是维度大小而非坐标
|
||||||
& LLPAR, DUMMY_TRUE , QUIET=.TRUE.)
|
& LLPAR, DUMMY_TRUE , QUIET=.TRUE.) ! DUMMY_TRUE 为读取的观测数据?
|
||||||
GC_CH4_TRUE_ARRAY(:,:,:) = DUMMY_TRUE(:,:,:)
|
GC_CH4_TRUE_ARRAY(:,:,:) = DUMMY_TRUE(:,:,:)
|
||||||
|
|
||||||
! Convert from [kg] --> [v/v]
|
! Convert from [kg] --> [v/v] 单位转换
|
||||||
DO II=1,IIPAR
|
DO II=1,IIPAR
|
||||||
DO JJ=1,JJPAR
|
DO JJ=1,JJPAR
|
||||||
DO LG=1,LLPAR
|
DO LG=1,LLPAR
|
||||||
@ -543,7 +543,7 @@
|
|||||||
print*, ' - CALC_GEOCAPE_CH4_FORCE ', GET_NYMD(), GET_NHMS()
|
print*, ' - CALC_GEOCAPE_CH4_FORCE ', GET_NYMD(), GET_NHMS()
|
||||||
|
|
||||||
|
|
||||||
! Loop over each grid box north of the minimum latitude
|
! Loop over each grid box north of the minimum latitude 对于每个网格进行循环
|
||||||
! 1. Determine number of observations in the current grid box
|
! 1. Determine number of observations in the current grid box
|
||||||
! 2. Make obseravations
|
! 2. Make obseravations
|
||||||
DO II = 1, IIPAR
|
DO II = 1, IIPAR
|
||||||
@ -582,7 +582,7 @@
|
|||||||
! Get GEOS-Chem pressure and CH4 column corresponding to this grid box.
|
! Get GEOS-Chem pressure and CH4 column corresponding to this grid box.
|
||||||
! CH4 in [kg/box] and pressure in [hPa]
|
! CH4 in [kg/box] and pressure in [hPa]
|
||||||
! Get column of pressure centers and CH4 values
|
! Get column of pressure centers and CH4 values
|
||||||
DO LG=1,LLPAR
|
DO LG=1,LLPAR ! 对垂直上进行循环,计算柱浓度
|
||||||
|
|
||||||
! Pressure centers [hPa]
|
! Pressure centers [hPa]
|
||||||
GC_PCENTER(LG) = GET_PCENTER(II,JJ,LG)
|
GC_PCENTER(LG) = GET_PCENTER(II,JJ,LG)
|
||||||
@ -605,7 +605,7 @@
|
|||||||
! GEOS-Chem surface pressure < GEOCAPE pressure levels
|
! GEOS-Chem surface pressure < GEOCAPE pressure levels
|
||||||
nlev = count( PRESSURE_EDGE .LT. GC_PEDGE(1) )
|
nlev = count( PRESSURE_EDGE .LT. GC_PEDGE(1) )
|
||||||
IF ( nlev .LT. 13 ) nlev = nlev + 1
|
IF ( nlev .LT. 13 ) nlev = nlev + 1
|
||||||
lind = LLGEOCAPE + 1 - nlev ! minimum vertical index on GEOCAPE grid
|
lind = LLGEOCAPE + 1 - nlev ! minimum vertical index on GEOCAPE grid 最小气压层的索引
|
||||||
|
|
||||||
|
|
||||||
! Get interpolation matrix that maps GEOS-Chem to GEOCAPE grid
|
! Get interpolation matrix that maps GEOS-Chem to GEOCAPE grid
|
||||||
@ -908,13 +908,13 @@
|
|||||||
!******************************************************************************
|
!******************************************************************************
|
||||||
! Subroutine CALC_GEOCAPE_CH4_FORCE calculates the adjoint forcing from the GEOCAPE
|
! Subroutine CALC_GEOCAPE_CH4_FORCE calculates the adjoint forcing from the GEOCAPE
|
||||||
! CH4 observations and updates the cost function. (kjw, 07/20/11)
|
! CH4 observations and updates the cost function. (kjw, 07/20/11)
|
||||||
!
|
! 似乎是伴随强迫使用的程序,输出不仅有代价函数,还有伴随强迫(不过需要输入扰动)
|
||||||
!
|
!
|
||||||
! Arguments as Input/Output:
|
! Arguments as Input/Output:
|
||||||
! ============================================================================
|
! ============================================================================
|
||||||
! (1 ) COST_FUNC_A (REAL*8) : Cost funciton (INOUT) [unitless]
|
! (1 ) COST_FUNC_A (REAL*8) : Cost funciton (INOUT) [unitless]
|
||||||
! (2 ) PERT (Real*8) : Array of perturbations to CH4 column (+/- 0.1, for ex.)
|
! (2 ) PERT (Real*8) : Array of perturbations to CH4 column (+/- 0.1, for ex.) 扰动的柱浓度
|
||||||
! (5 ) ADJ (REAL*8) : Array of adjoint forcings (OUT)
|
! (5 ) ADJ (REAL*8) : Array of adjoint forcings (OUT) 强迫伴随
|
||||||
!
|
!
|
||||||
! NOTES:
|
! NOTES:
|
||||||
! (1 )
|
! (1 )
|
||||||
|
Reference in New Issue
Block a user