diff --git a/src/MNH/mode_sensor.f90 b/src/MNH/mode_sensor.f90 index 1eb047b839d368fad17ea76f9e9a45e2cfd0396b..bd6c86b3b6ee45c674bba2638188b766f3cd947b 100644 --- a/src/MNH/mode_sensor.f90 +++ b/src/MNH/mode_sensor.f90 @@ -21,6 +21,9 @@ MODULE MODE_SENSOR PUBLIC :: ADD_FIXPOINT PUBLIC :: ADD_POINT PUBLIC :: ADD_PROFILE + PUBLIC :: ADD_ORILAM_DATA + PUBLIC :: ADD_DUST_DATA + PUBLIC :: ADD_SALT_DATA PUBLIC :: SENSOR_WRITE_WORKARRAYS_ALLOCATE PUBLIC :: SENSOR_WRITE_WORKARRAYS_DEALLOCATE PUBLIC :: SENSOR_CURRENT_PROCESSES_NUMBER_GET @@ -513,6 +516,290 @@ CONTAINS END SUBROUTINE ADD_PROFILE + SUBROUTINE ADD_ORILAM_DATA( TPSENSOR, KLEVEL, KSTORE ) + USE MODD_CH_AEROSOL + USE MODD_CONF_N, ONLY: NRR + USE MODD_CH_AEROSOL, ONLY: NCARB, NSOA, NSP + USE MODD_CST, ONLY: XP00, XCPD, XRD, XRV + USE MODD_NSV, ONLY: NSV_AER, NSV_AERBEG, NSV_AEREND + + USE MODE_AERO_PSD, ONLY: PPP2AERO + + CLASS(TSENSOR), INTENT(IN) :: TPSENSOR + INTEGER, INTENT(IN) :: KLEVEL ! Number of vertical levels + INTEGER, INTENT(IN) :: KSTORE ! Number of store instants + + INTEGER :: JRR + INTEGER :: JSV + CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT + CHARACTER(LEN=NMNHNAMELGTMAX) :: YTITLE + REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO + REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZRG, ZSIG + REAL, DIMENSION(:,:,:,:,:), ALLOCATABLE :: ZPTOTA + + IF ( .NOT. LORILAM ) RETURN + + ALLOCATE( ZSV (1, KLEVEL, KSTORE, NSV_AER) ) + ALLOCATE( ZRHO(1, KLEVEL, KSTORE) ) + ALLOCATE( ZN0 (1, KLEVEL, KSTORE, JPMODE) ) + ALLOCATE( ZRG (1, KLEVEL, KSTORE, JPMODE) ) + ALLOCATE( ZSIG(1, KLEVEL, KSTORE, JPMODE) ) + ALLOCATE( ZPTOTA(1, KLEVEL, KSTORE, NSP+NCARB+NSOA, JPMODE )) + + ZSV(1,:,:,1:NSV_AER) = TPSENSOR%XSV(:,:,NSV_AERBEG:NSV_AEREND) + + IF ( NRR > 0 ) THEN + ZRHO(1,:,:) = 0. + DO JRR = 1, NRR + ZRHO(1,:,:) = ZRHO(1,:,:) + TPSENSOR%XR(:,:,JRR) + END DO + ZRHO(1,:,:) = TPSENSOR%XTH(:,:) * ( 1. + XRV / XRD * TPSENSOR%XR(:,:,1) ) / ( 1. + ZRHO(1,:,:) ) + ELSE + ZRHO(1,:,:) = TPSENSOR%XTH(:,:) + ENDIF + + ZRHO(1,:,:) = TPSENSOR%XP(:,:) / ( XRD * ZRHO(1,:,:) * ( ( TPSENSOR%XP(:,:) / XP00 ) ** ( XRD / XCPD ) ) ) + + CALL PPP2AERO( ZSV, ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0, PCTOTA=ZPTOTA ) + + DO JSV = 1, JPMODE + ! mean radius + WRITE( YTITLE, '( a6, i1 )' ) 'AERRGA', JSV + WRITE( YCOMMENT, '( a18, i1 )' ) 'RG (nb) AERO MODE ', JSV + CALL ADD_PROFILE( YTITLE, YCOMMENT, 'um', ZRG(1,:,:,JSV) ) + + ! standard deviation + WRITE( YTITLE, '( A7, I1 )' ) 'AERSIGA', JSV + WRITE( YCOMMENT, '( A16, I1 )' ) 'SIGMA AERO MODE ', JSV + CALL ADD_PROFILE( YTITLE, YCOMMENT, '1', ZSIG(1,:,:,JSV) ) + + ! particles number + WRITE( YTITLE, '( A6, I1 )' ) 'AERN0A', JSV + WRITE( YCOMMENT, '( A13, I1 )' ) 'N0 AERO MODE ', JSV + CALL ADD_PROFILE( YTITLE, YCOMMENT, 'm-3', ZN0(1,:,:,JSV) ) + + ! mass concentration in microg/m3 + ! sulfate + WRITE( YTITLE,'(A,I1)')'MSO4',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS SO4 AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SO4,JSV) ) + + ! nitrate + WRITE( YTITLE,'(A,I1)')'MNO3',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS NO3 AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_NO3,JSV) ) + + ! amoniac + WRITE( YTITLE,'(A,I1)')'MNH3',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS NH3 AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_NH3,JSV) ) + + ! water + WRITE( YTITLE,'(A,I1)')'MH2O',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS H2O AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_H2O,JSV) ) + + IF ( NSOA == 10 ) THEN + ! SOA1 + WRITE( YTITLE,'(A,I1)')'MSOA1',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS SOA1 AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA1,JSV) ) + + ! SOA2 + WRITE( YTITLE,'(A,I1)')'MSOA2',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS SOA2 AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA2,JSV) ) + + ! SOA3 + WRITE( YTITLE,'(A,I1)')'MSOA3',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS SOA3 AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA3,JSV) ) + + ! SOA4 + WRITE( YTITLE,'(A,I1)')'MSOA4',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS SOA4 AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA4,JSV) ) + + ! SOA5 + WRITE( YTITLE,'(A,I1)')'MSOA5',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS SOA5 AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA5,JSV) ) + + ! SOA6 + WRITE( YTITLE,'(A,I1)')'MSOA6',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS SOA6 AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA6,JSV) ) + + ! SOA7 + WRITE( YTITLE,'(A,I1)')'MSOA7',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS SOA7 AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA7,JSV) ) + + ! SOA8 + WRITE( YTITLE,'(A,I1)')'MSOA8',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS SOA8 AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA8,JSV) ) + + ! SOA9 + WRITE( YTITLE,'(A,I1)')'MSOA9',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS SOA9 AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA9,JSV) ) + + ! SOA10 + WRITE( YTITLE,'(A,I1)')'MSOA10',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS SOA10 AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA10,JSV) ) + END IF + + ! OC + WRITE( YTITLE,'(A,I1)')'MOC',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS OC AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_OC,JSV) ) + + ! BC + WRITE( YTITLE,'(A,I1)')'MBC',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS BC AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_BC,JSV) ) + + ! dust + WRITE( YTITLE,'(A,I1)')'MDUST',JSV + WRITE( YCOMMENT,'(A,I1)')'MASS DUST AEROSOL MODE ',JSV + CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_DST,JSV) ) + END DO + + DEALLOCATE( ZSV, ZRHO, ZN0, ZRG, ZSIG, ZPTOTA ) + + END SUBROUTINE ADD_ORILAM_DATA + + SUBROUTINE ADD_DUST_DATA( TPSENSOR, KLEVEL, KSTORE ) + USE MODD_CONF_N, ONLY: NRR + USE MODD_CST, ONLY: XP00, XCPD, XRD, XRV + USE MODD_DUST + USE MODD_NSV, ONLY: NSV_DST, NSV_DSTBEG, NSV_DSTEND + + USE MODE_DUST_PSD, ONLY: PPP2DUST + + CLASS(TSENSOR), INTENT(IN) :: TPSENSOR + INTEGER, INTENT(IN) :: KLEVEL ! Number of vertical levels + INTEGER, INTENT(IN) :: KSTORE ! Number of store instants + + INTEGER :: JRR + INTEGER :: JSV + CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT + CHARACTER(LEN=NMNHNAMELGTMAX) :: YTITLE + REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO + REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZRG, ZSIG + + IF ( .NOT. LDUST ) RETURN + + ALLOCATE( ZSV (1, KLEVEL, KSTORE, NSV_DST) ) + ALLOCATE( ZRHO(1, KLEVEL, KSTORE) ) + ALLOCATE( ZN0 (1, KLEVEL, KSTORE, NMODE_DST) ) + ALLOCATE( ZRG (1, KLEVEL, KSTORE, NMODE_DST) ) + ALLOCATE( ZSIG(1, KLEVEL, KSTORE, NMODE_DST) ) + + ZSV(1,:,:,1:NSV_DST) = TPSENSOR%XSV(:,:,NSV_DSTBEG:NSV_DSTEND) + + IF ( NRR > 0 ) THEN + ZRHO(1,:,:) = 0. + DO JRR = 1, NRR + ZRHO(1,:,:) = ZRHO(1,:,:) + TPSENSOR%XR(:,:,JRR) + END DO + ZRHO(1,:,:) = TPSENSOR%XTH(:,:) * ( 1. + XRV / XRD * TPSENSOR%XR(:,:,1) ) / ( 1. + ZRHO(1,:,:) ) + ELSE + ZRHO(1,:,:) = TPSENSOR%XTH(:,:) + ENDIF + + ZRHO(1,:,:) = TPSENSOR%XP(:,:) / ( XRD * ZRHO(1,:,:) * ( ( TPSENSOR%XP(:,:) / XP00 ) ** ( XRD / XCPD ) ) ) + + CALL PPP2DUST( ZSV, ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0 ) + + DO JSV = 1, NMODE_DST + ! mean radius + WRITE( YTITLE, '( a6, i1 )' ) 'DSTRGA', JSV + WRITE( YCOMMENT, '( a18, i1 )' ) 'RG (nb) DUST MODE ', JSV + CALL ADD_PROFILE( YTITLE, YCOMMENT, 'um', ZRG(1,:,:,JSV) ) + + ! standard deviation + WRITE( YTITLE, '( A7, I1 )' ) 'DSTSIGA', JSV + WRITE( YCOMMENT, '( A16, I1 )' ) 'SIGMA DUST MODE ', JSV + CALL ADD_PROFILE( YTITLE, YCOMMENT, '', ZSIG(1,:,:,JSV) ) + + ! particles number + WRITE( YTITLE, '( A6, I1 )' ) 'DSTN0A', JSV + WRITE( YCOMMENT, '( A13, I1 )' ) 'N0 DUST MODE ', JSV + CALL ADD_PROFILE( YTITLE, YCOMMENT, 'm-3', ZN0(1,:,:,JSV) ) + END DO + + DEALLOCATE ( ZSV, ZRHO, ZN0, ZRG, ZSIG ) + + END SUBROUTINE ADD_DUST_DATA + + SUBROUTINE ADD_SALT_DATA( TPSENSOR, KLEVEL, KSTORE ) + USE MODD_CONF_N, ONLY: NRR + USE MODD_CST, ONLY: XP00, XCPD, XRD, XRV + USE MODD_NSV, ONLY: NSV_SLT, NSV_SLTBEG, NSV_SLTEND + USE MODD_SALT + + USE MODE_SALT_PSD, ONLY: PPP2SALT + + CLASS(TSENSOR), INTENT(IN) :: TPSENSOR + INTEGER, INTENT(IN) :: KLEVEL ! Number of vertical levels + INTEGER, INTENT(IN) :: KSTORE ! Number of store instants + + INTEGER :: JRR + INTEGER :: JSV + CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT + CHARACTER(LEN=NMNHNAMELGTMAX) :: YTITLE + REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO + REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZRG, ZSIG + + IF ( .NOT. LSALT ) RETURN + + ALLOCATE( ZSV (1, KLEVEL, KSTORE, NSV_SLT) ) + ALLOCATE( ZRHO(1, KLEVEL, KSTORE) ) + ALLOCATE( ZN0 (1, KLEVEL, KSTORE, NMODE_SLT) ) + ALLOCATE( ZRG (1, KLEVEL, KSTORE, NMODE_SLT) ) + ALLOCATE( ZSIG(1, KLEVEL, KSTORE, NMODE_SLT) ) + + ZSV(1,:,:,1:NSV_SLT) = TPSENSOR%XSV(:,:,NSV_SLTBEG:NSV_SLTEND) + + IF ( NRR > 0 ) THEN + ZRHO(1,:,:) = 0. + DO JRR = 1, NRR + ZRHO(1,:,:) = ZRHO(1,:,:) + TPSENSOR%XR(:,:,JRR) + END DO + ZRHO(1,:,:) = TPSENSOR%XTH(:,:) * ( 1. + XRV / XRD * TPSENSOR%XR(:,:,1) ) / ( 1. + ZRHO(1,:,:) ) + ELSE + ZRHO(1,:,:) = TPSENSOR%XTH(:,:) + ENDIF + + ZRHO(1,:,:) = TPSENSOR%XP(:,:) / ( XRD * ZRHO(1,:,:) * ( ( TPSENSOR%XP(:,:) / XP00 ) ** ( XRD / XCPD ) ) ) + + CALL PPP2SALT( ZSV, ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0 ) + + DO JSV = 1, NMODE_SLT + ! mean radius + WRITE( YTITLE, '( a6, i1 )' ) 'SLTRGA', JSV + WRITE( YCOMMENT, '( a18, i1 )' ) 'RG (nb) SALT MODE ', JSV + CALL ADD_PROFILE( YTITLE, YCOMMENT, 'um', ZRG(1,:,:,JSV) ) + + ! standard deviation + WRITE( YTITLE, '( A7, I1 )' ) 'SLTSIGA', JSV + WRITE( YCOMMENT, '( A16, I1 )' ) 'SIGMA SALT MODE ', JSV + CALL ADD_PROFILE( YTITLE, YCOMMENT, '', ZSIG(1,:,:,JSV) ) + + ! particles number + WRITE( YTITLE, '( A6, I1 )' ) 'SLTN0A', JSV + WRITE( YCOMMENT, '( A13, I1 )' ) 'N0 SALT MODE ', JSV + CALL ADD_PROFILE( YTITLE, YCOMMENT, 'm-3', ZN0(1,:,:,JSV) ) + END DO + + DEALLOCATE ( ZSV, ZRHO, ZN0, ZRG, ZSIG ) + + END SUBROUTINE ADD_SALT_DATA + + SUBROUTINE SENSOR_WRITE_WORKARRAYS_ALLOCATE( KLEVEL, KSTORE, KPROCMAX ) INTEGER, INTENT(IN) :: KLEVEL ! Number of vertical levels INTEGER, INTENT(IN) :: KSTORE ! Number of store instants @@ -530,6 +817,7 @@ CONTAINS SUBROUTINE SENSOR_WRITE_WORKARRAYS_DEALLOCATE( ) + NPROCCUR = 0 NPROCMAX = 0 @@ -544,4 +832,5 @@ CONTAINS KNPROCCUR = NPROCCUR END FUNCTION SENSOR_CURRENT_PROCESSES_NUMBER_GET + END MODULE MODE_SENSOR diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index 5d68623924719addff760e085c91c0ca574365db..367f1e762fe93959809b3e4228eb44a74a7494ad 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -7,7 +7,7 @@ MODULE MODE_WRITE_AIRCRAFT_BALLOON ! ########################### -use modd_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NUNITLGTMAX +use modd_parameters, only: NMNHNAMELGTMAX use mode_msg @@ -192,38 +192,31 @@ SUBROUTINE FLYER_DIACHRO( TPDIAFILE, TPFLYER ) USE MODD_AIRCRAFT_BALLOON use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, & tbudiachrometadata -USE MODD_CST, ONLY: XRV +USE MODD_CH_AEROSOL, ONLY: JPMODE, LORILAM, NCARB, NSOA, NSP +USE MODD_CST, ONLY: XP00, XCPD, XRD, XRV +USE MODD_DUST, ONLY: LDUST, NMODE_DST use modd_field, only: NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, NMNHDIM_FLYER_PROC, NMNHDIM_FLYER_TIME, NMNHDIM_UNUSED, & tfieldmetadata_base, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_NSV, ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, nsv_dst, nsv_dstbeg, nsv_dstend, & - nsv_lima_beg, nsv_lima_end +USE MODD_NSV, ONLY: tsvlist, nsv USE MODD_PARAMETERS, ONLY: XUNDEF USE MODD_PARAM_n, ONLY: CCLOUD +USE MODD_SALT, ONLY: LSALT, NMODE_SLT -USE MODE_AERO_PSD use mode_aircraft_balloon, only: Aircraft_balloon_longtype_get -USE MODE_DUST_PSD USE MODE_MODELN_HANDLER, ONLY: GET_CURRENT_MODEL_INDEX -use mode_sensor, only: Add_fixpoint, Add_point, Add_profile, Sensor_current_processes_number_get, & +use mode_sensor, only: Add_dust_data, Add_fixpoint, Add_orilam_data, Add_point, Add_profile, Add_salt_data, & + Sensor_current_processes_number_get, & ccomment, ctitle, cunit, xwork6, & Sensor_write_workarrays_allocate, Sensor_write_workarrays_deallocate use mode_write_diachro, only: Write_diachro - TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write CLASS(TFLYERDATA), INTENT(IN) :: TPFLYER ! !* 0.2 declaration of local variables for diachro ! -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG -REAL, DIMENSION(:,:,:,:,:), ALLOCATABLE :: ZPTOTA -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO -! CHARACTER(LEN=NMNHNAMELGTMAX) :: YTITLE -CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT -CHARACTER(LEN=NUNITLGTMAX) :: YUNIT -! INTEGER :: IMI ! current model index INTEGER :: IPROC ! number of variables records INTEGER :: JPROC ! loop counter @@ -235,7 +228,8 @@ INTEGER :: JRR ! loop counter INTEGER :: JSV ! loop counter INTEGER :: JPT ! loop counter INTEGER :: IKU -REAL, DIMENSION(:), ALLOCATABLE :: ZLWC ! Temporary array to store/compute Liquid Water Content at flyer position +REAL, DIMENSION(:), ALLOCATABLE :: ZLWC ! Temporary array to store/compute Liquid Water Content at flyer position +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO type(tbudiachrometadata) :: tzbudiachro type(tfieldmetadata_base), dimension(:), allocatable :: tzfields ! @@ -257,7 +251,8 @@ IF ( IRR > 1 ) IPROC = IPROC + 1 IF ( SIZE( TPFLYER%XTKE ) > 0 ) IPROC = IPROC + 1 IPROC = IPROC + 1 ! TKE_DISS IF ( LORILAM ) IPROC = IPROC + JPMODE * ( 3 + NSOA + NCARB + NSP ) -IF ( LDUST ) IPROC = IPROC + NMODE_DST * 3 +IF ( LDUST ) IPROC = IPROC + NMODE_DST * 3 +IF ( LSALT ) IPROC = IPROC + NMODE_SLT * 3 IF ( SIZE( TPFLYER%XTSRAD ) > 0 ) IPROC = IPROC + 1 ! ISTORE = SIZE( TPFLYER%TFLYER_TIME%TPDATES ) @@ -346,167 +341,15 @@ IF (SIZE(TPFLYER%XSV,3)>=1) THEN END IF END DO - IF ((LORILAM).AND. .NOT.(ANY(TPFLYER%XP(1,:) == 0.))) THEN - - ALLOCATE (ZSV(1,1,ISTORE,NSV_AER)) - ALLOCATE (ZRHO(1,1,ISTORE)) - ALLOCATE (ZN0(1,1,ISTORE,JPMODE)) - ALLOCATE (ZRG(1,1,ISTORE,JPMODE)) - ALLOCATE (ZSIG(1,1,ISTORE,JPMODE)) - ALLOCATE (ZPTOTA(1,1,ISTORE,NSP+NCARB+NSOA,JPMODE)) - ZSV(1,1,:,1:NSV_AER) = TPFLYER%XSV(1,:,NSV_AERBEG:NSV_AEREND) - IF (IRR >0) THEN - ZRHO(1,1,:) = 0. - DO JRR=1,IRR - ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(1,:,JRR) - ENDDO - ZRHO(1,1,:) = TPFLYER%XTH(1,:) * ( 1. + XRV/XRD*TPFLYER%XR(1,:,1) ) & - / ( 1. + ZRHO(1,1,:) ) - ELSE - ZRHO(1,1,:) = TPFLYER%XTH(1,:) - ENDIF - ZRHO(1,1,:) = TPFLYER%XP(1,:) / & - (XRD *ZRHO(1,1,:) *((TPFLYER%XP(1,:)/XP00)**(XRD/XCPD)) ) - ZSIG = 0. - ZRG = 0. - ZN0 = 0. - ZPTOTA = 0. - DO JPT=1,ISTORE ! prevent division by zero if ZSV = 0. - IF (ALL(ZSV(1,1,JPT,:)/=0.)) THEN - CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0, PCTOTA=ZPTOTA) - ENDIF - ENDDO - DO JSV=1,JPMODE - ! mean radius - WRITE(YTITLE,'(A,I1)')'AERRGA',JSV - WRITE(YCOMMENT,'(A,I1)')'RG (nb) AERO MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'um', ZRG(1,1,:,JSV) ) - ! standard deviation - WRITE(YTITLE,'(A,I1)')'AERSIGA',JSV - WRITE(YCOMMENT,'(A,I1)')'SIGMA AERO MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), '1', ZSIG(1,1,:,JSV) ) - ! particles number - WRITE(YTITLE,'(A,I1)')'AERN0A',JSV - WRITE(YCOMMENT,'(A,I1)')'N0 AERO MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'm-3', ZN0(1,1,:,JSV) ) - ! mass concentration in microg/m3 - ! sulfate - WRITE(YTITLE,'(A,I1)')'MSO4',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS SO4 AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SO4,JSV) ) - ! nitrate - WRITE(YTITLE,'(A,I1)')'MNO3',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS NO3 AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_NO3,JSV) ) - ! amoniac - WRITE(YTITLE,'(A,I1)')'MNH3',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS NH3 AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_NH3,JSV) ) - ! water - WRITE(YTITLE,'(A,I1)')'MH2O',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS H2O AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_H2O,JSV) ) - IF (NSOA .EQ. 10) THEN - ! SOA1 - WRITE(YTITLE,'(A,I1)')'MSOA1',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS SOA1 AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA1,JSV) ) - ! SOA2 - WRITE(YTITLE,'(A,I1)')'MSOA2',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS SOA2 AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA2,JSV) ) - ! SOA3 - WRITE(YTITLE,'(A,I1)')'MSOA3',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS SOA3 AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA3,JSV) ) - ! SOA4 - WRITE(YTITLE,'(A,I1)')'MSOA4',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS SOA4 AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA4,JSV) ) - ! SOA5 - WRITE(YTITLE,'(A,I1)')'MSOA5',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS SOA5 AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA5,JSV) ) - ! SOA6 - WRITE(YTITLE,'(A,I1)')'MSOA6',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS SOA6 AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA6,JSV) ) - ! SOA7 - WRITE(YTITLE,'(A,I1)')'MSOA7',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS SOA7 AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA7,JSV) ) - ! SOA8 - WRITE(YTITLE,'(A,I1)')'MSOA8',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS SOA8 AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA8,JSV) ) - ! SOA9 - WRITE(YTITLE,'(A,I1)')'MSOA9',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS SOA9 AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA9,JSV) ) - ! SOA10 - WRITE(YTITLE,'(A,I1)')'MSOA10',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS SOA10 AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA10,JSV) ) - ENDIF - ! OC - WRITE(YTITLE,'(A,I1)')'MOC',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS OC AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_OC,JSV) ) - ! BC - WRITE(YTITLE,'(A,I1)')'MBC',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS BC AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_BC,JSV) ) - ! dust - WRITE(YTITLE,'(A,I1)')'MDUST',JSV - WRITE(YCOMMENT,'(A,I1)')'MASS DUST AEROSOL MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_DST,JSV) ) - ENDDO - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG,ZPTOTA) - END IF - - IF ((LDUST).AND. .NOT.(ANY(TPFLYER%XP(1,:) == 0.))) THEN - ALLOCATE (ZSV(1,1,ISTORE,NSV_DST)) - ALLOCATE (ZRHO(1,1,ISTORE)) - ALLOCATE (ZN0(1,1,ISTORE,NMODE_DST)) - ALLOCATE (ZRG(1,1,ISTORE,NMODE_DST)) - ALLOCATE (ZSIG(1,1,ISTORE,NMODE_DST)) - ZSV(1,1,:,1:NSV_DST) = TPFLYER%XSV(1,:,NSV_DSTBEG:NSV_DSTEND) - IF (IRR >0) THEN - ZRHO(1,1,:) = 0. - DO JRR=1,IRR - ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(1,:,JRR) - ENDDO - ZRHO(1,1,:) = TPFLYER%XTH(1,:) * ( 1. + XRV/XRD*TPFLYER%XR(1,:,1) ) & - / ( 1. + ZRHO(1,1,:) ) - ELSE - ZRHO(1,1,:) = TPFLYER%XTH(1,:) - ENDIF - ZRHO(1,1,:) = TPFLYER%XP(1,:) / & - (XRD *ZRHO(1,1,:) *((TPFLYER%XP(1,:)/XP00)**(XRD/XCPD)) ) - CALL PPP2DUST(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0) - DO JSV=1,NMODE_DST - ! mean radius - WRITE(YTITLE,'(A,I1)')'DSTRGA',JSV - WRITE(YCOMMENT,'(A,I1)')'RG (nb) DUST MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'um', ZRG(1,1,:,JSV) ) - ! standard deviation - WRITE(YTITLE,'(A,I1)')'DSTSIGA',JSV - WRITE(YCOMMENT,'(A,I1)')'SIGMA DUST MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), '1', ZSIG(1,1,:,JSV) ) - ! particles number - WRITE(YTITLE,'(A,I1)')'DSTN0A',JSV - WRITE(YCOMMENT,'(A,I1)')'N0 DUST MODE ',JSV - call Add_point( Trim( ytitle ), Trim( ycomment ), 'm-3', ZN0(1,1,:,JSV) ) - ENDDO - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG) - END IF + if ( lorilam ) call Add_orilam_data( tpflyer, 1, istore ) + if ( ldust ) call Add_dust_data ( tpflyer, 1, istore ) + if ( lsalt ) call Add_salt_data ( tpflyer, 1, istore ) ENDIF ! IF ( SIZE( TPFLYER%XTSRAD ) > 0 ) call Add_point( 'Tsrad', 'Radiative Surface Temperature', 'K', TPFLYER%XTSRAD(:) ) ! jproc = Sensor_current_processes_number_get() + allocate( tzfields( jproc ) ) tzfields(:)%cmnhname = ctitle(1 : jproc) diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index 99e8dc6bbac11f74b33ef11720a3503dce123bc8..1c26e3c0ececf39cefc4ebd537c639b8cc33a510 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -25,7 +25,7 @@ MODULE MODE_WRITE_PROFILER_n ! ########################### -use modd_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NUNITLGTMAX +use modd_parameters, only: NMNHNAMELGTMAX, NUNITLGTMAX implicit none @@ -42,7 +42,7 @@ SUBROUTINE PROFILER_DIACHRO_n( TPDIAFILE, TPPROFILER ) USE MODD_ALLPROFILER_n, ONLY: LDIAG_SURFRAD_PROF use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, & tbudiachrometadata -USE MODD_CH_AEROSOL, ONLY: LORILAM, JPMODE +USE MODD_CH_AEROSOL, ONLY: JPMODE, LORILAM, NCARB, NSOA, NSP USE MODD_CONF, ONLY: LCARTESIAN USE MODD_CONF_n, ONLY: NRR USE MODD_CST, ONLY: XRV @@ -51,19 +51,18 @@ USE MODD_DIM_n, ONLY: NKMAX use modd_field, only: NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, NMNHDIM_PROFILER_TIME, NMNHDIM_PROFILER_PROC, NMNHDIM_UNUSED, & tfieldmetadata_base, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_NSV, ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, nsv_dst, nsv_dstbeg, nsv_dstend +USE MODD_NSV, ONLY: tsvlist, nsv USE MODD_PARAMETERS, ONLY: JPVEXT, XUNDEF USE MODD_PARAM_n, ONLY: CCLOUD, CRAD, CTURB USE MODD_PROFILER_n USE MODD_RADIATIONS_n, ONLY: NAER -USE MODD_SALT, ONLY: LSALT +USE MODD_SALT, ONLY: LSALT, NMODE_SLT USE MODD_TYPE_STATPROF ! -USE MODE_AERO_PSD -USE MODE_DUST_PSD -use mode_sensor, only: Add_fixpoint, Add_point, Add_profile, Sensor_current_processes_number_get, & - ccomment, ctitle, cunit, xwork6, & - Sensor_write_workarrays_allocate, Sensor_write_workarrays_deallocate +use mode_sensor, only: Add_dust_data, Add_fixpoint, Add_orilam_data, Add_point, Add_profile, Add_salt_data, & + Sensor_current_processes_number_get, & + ccomment, ctitle, cunit, xwork6, & + Sensor_write_workarrays_allocate, Sensor_write_workarrays_deallocate use mode_write_diachro, only: Write_diachro ! TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! diachronic file to write @@ -71,7 +70,6 @@ TYPE(TPROFILERDATA), INTENT(IN) :: TPPROFILER ! !* 0.2 declaration of local variables for diachro ! -character(len=NCOMMENTLGTMAX) :: ycomment character(len=NMNHNAMELGTMAX) :: ytitle character(len=NUNITLGTMAX) :: yunit INTEGER :: IKU @@ -80,11 +78,9 @@ INTEGER :: JPROC integer :: jproc_alt, jproc_w INTEGER :: JRR ! loop counter INTEGER :: JSV ! loop counter -integer :: ji INTEGER :: ISTORE REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG type(tbudiachrometadata) :: tzbudiachro type(tfieldmetadata_base), dimension(:), allocatable :: tzfields ! @@ -97,8 +93,9 @@ if ( ccloud == 'C2R2' .or. ccloud == 'KHKO' ) IPROC = IPROC + 1 if ( ccloud /= 'NONE' .and. ccloud /= 'REVE' ) IPROC = IPROC + 1 if ( ccloud == 'ICE3' .or. ccloud == 'ICE4' ) IPROC = IPROC + 1 if ( ccloud == 'LIMA' ) IPROC = IPROC + 3 -IF (LORILAM) IPROC = IPROC + JPMODE * 3 -IF (LDUST) IPROC = IPROC + NMODE_DST * 3 +IF ( LORILAM ) IPROC = IPROC + JPMODE * ( 3 + NSOA + NCARB + NSP ) +IF ( LDUST ) IPROC = IPROC + NMODE_DST * 3 +IF ( LSALT ) IPROC = IPROC + NMODE_SLT * 3 IF (LDUST .OR. LORILAM .OR. LSALT) IPROC=IPROC+NAER IF ( CTURB == 'TKEL' ) IPROC = IPROC + 1 @@ -166,100 +163,10 @@ if ( nsv > 0 ) then end do Deallocate( zwork ) - IF ( LORILAM .AND. .NOT.(ANY(TPPROFILER%XP(:,:) == 0.)) ) THEN - ALLOCATE (ZSV (1,iku,ISTORE,NSV_AER)) - ALLOCATE (ZRHO(1,iku,ISTORE)) - ALLOCATE (ZN0 (1,iku,ISTORE,JPMODE)) - ALLOCATE (ZRG (1,iku,ISTORE,JPMODE)) - ALLOCATE (ZSIG(1,iku,ISTORE,JPMODE)) - do ji = 1, iku - ZSV(1,ji,:,1:NSV_AER) = TPPROFILER%XSV(ji,:,NSV_AERBEG:NSV_AEREND) - end do - IF ( NRR > 0) THEN - ZRHO(1,:,:) = 0. - do ji = 1, iku - DO JRR = 1, NRR - ZRHO(1,ji,:) = ZRHO(1,ji,:) + TPPROFILER%XR(ji,:,JRR) - ENDDO - ZRHO(1,ji,:) = TPPROFILER%XTH(ji,:) * ( 1. + XRV/XRD*TPPROFILER%XR(ji,:,1) ) & - / ( 1. + ZRHO(1,ji,:) ) - end do - ELSE - do ji = 1, iku - ZRHO(1,ji,:) = TPPROFILER%XTH(ji,:) - end do - ENDIF - do ji = 1, iku - ZRHO(1,ji,:) = TPPROFILER%XP(ji,:) / & - (XRD *ZRHO(1,ji,:) *((TPPROFILER%XP(ji,:)/XP00)**(XRD/XCPD)) ) - end do - CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0) - DO JSV=1,JPMODE - ! mean radius - WRITE( YTITLE, '( A6, I1 )' ) 'AERRGA', JSV - WRITE( YCOMMENT, '( A18, I1 )' ) 'RG (nb) AERO MODE ', JSV - call Add_profile( ytitle, ycomment, 'um', ZRG(1,:,:,JSV) ) - - ! standard deviation - WRITE( YTITLE, '( A7, I1 )' ) 'AERSIGA', JSV - WRITE( YCOMMENT, '( A16, I1 )' ) 'SIGMA AERO MODE ', JSV - call Add_profile( ytitle, ycomment, '', ZSIG(1,:,:,JSV) ) - - ! particles number - WRITE( YTITLE, '( A6, I1 )' ) 'AERN0A', JSV - WRITE( YCOMMENT, '( A13, I1 )' ) 'N0 AERO MODE ', JSV - call Add_profile( ytitle, ycomment, 'm-3', ZN0(1,:,:,JSV) ) - ENDDO - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG) - END IF - IF ((LDUST).AND. .NOT.(ANY(TPPROFILER%XP(:,:) == 0.))) THEN - ALLOCATE (ZSV (1,iku,ISTORE,NSV_DST)) - ALLOCATE (ZRHO(1,iku,ISTORE)) - ALLOCATE (ZN0 (1,iku,ISTORE,NMODE_DST)) - ALLOCATE (ZRG (1,iku,ISTORE,NMODE_DST)) - ALLOCATE (ZSIG(1,iku,ISTORE,NMODE_DST)) - do ji = 1, iku - ZSV(1,ji,:,1:NSV_DST) = TPPROFILER%XSV(ji,:,NSV_DSTBEG:NSV_DSTEND) - end do - IF ( NRR > 0 ) THEN - ZRHO(1,:,:) = 0. - do ji = 1, iku - DO JRR = 1, NRR - ZRHO(1,ji,:) = ZRHO(1,ji,:) + TPPROFILER%XR(ji,:,JRR) - ENDDO - ZRHO(1,ji,:) = TPPROFILER%XTH(ji,:) * ( 1. + XRV/XRD*TPPROFILER%XR(ji,:,1) ) & - / ( 1. + ZRHO(1,ji,:) ) - end do - ELSE - do ji = 1, iku - ZRHO(1,ji,:) = TPPROFILER%XTH(ji,:) - end do - ENDIF - do ji = 1, iku - ZRHO(1,ji,:) = TPPROFILER%XP(ji,:) / & - (XRD *ZRHO(1,ji,:) *((TPPROFILER%XP(ji,:)/XP00)**(XRD/XCPD)) ) - end do - CALL PPP2DUST(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0) - DO JSV=1,NMODE_DST - ! mean radius - WRITE( YTITLE, '( A6, I1 )' ) 'DSTRGA', JSV - WRITE( YCOMMENT, '( A18, I1 )' ) 'RG (nb) DUST MODE ', JSV - call Add_profile( ytitle, ycomment, 'um', ZRG(1,:,:,JSV) ) - - ! standard deviation - WRITE(YTITLE, '( A7, I1 )' ) 'DSTSIGA', JSV - WRITE(YCOMMENT, '( A16, I1 )' ) 'SIGMA DUST MODE ', JSV - call Add_profile( ytitle, ycomment, '', ZSIG(1,:,:,JSV) ) - - ! particles number - WRITE( YTITLE, '( A6, I1 )' ) 'DSTN0A', JSV - WRITE( YCOMMENT, '( A13, I1 )' ) 'N0 DUST MODE ', JSV - call Add_profile( ytitle, ycomment, 'm-3', ZN0(1,:,:,JSV) ) - ENDDO - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG) - END IF + if ( lorilam ) call Add_orilam_data( tpprofiler, iku, istore ) + if ( ldust ) call Add_dust_data ( tpprofiler, iku, istore ) + if ( lsalt ) call Add_salt_data ( tpprofiler, iku, istore ) + if ( ldust .or. lorilam .or. lsalt ) then do jsv = 1, naer Write( ytitle, '( a, i1 )' ) 'AEREXT', jsv diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90 index 2dff296341de7b4d047ba8fc294936e3b04fd139..38e050a283f3804aa8ba0f59acd26fb133100424 100644 --- a/src/MNH/write_stationn.f90 +++ b/src/MNH/write_stationn.f90 @@ -18,8 +18,6 @@ MODULE MODE_WRITE_STATION_n ! ########################### -use modd_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NUNITLGTMAX - implicit none private @@ -35,22 +33,20 @@ SUBROUTINE STATION_DIACHRO_n( TPDIAFILE, TPSTATION ) USE MODD_ALLSTATION_n, ONLY: LDIAG_SURFRAD_STAT use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, & tbudiachrometadata +USE MODD_CH_AEROSOL, ONLY: JPMODE, LORILAM, NCARB, NSOA, NSP USE MODD_CONF, ONLY: LCARTESIAN -USE MODD_CST, ONLY: XRV +USE MODD_DUST, ONLY: LDUST, NMODE_DST use modd_field, only: NMNHDIM_STATION_TIME, NMNHDIM_STATION_PROC, NMNHDIM_UNUSED, & tfieldmetadata_base, TYPEREAL USE MODD_IO, ONLY: TFILEDATA -USE MODD_NSV, ONLY: nsv, nsv_aer, nsv_aerbeg, nsv_aerend, & - nsv_dst, nsv_dstbeg, nsv_dstend, nsv_slt, nsv_sltbeg, nsv_sltend, & - tsvlist +USE MODD_NSV, ONLY: nsv, tsvlist USE MODD_PARAM_n, ONLY: CRAD, CSURF, CTURB +USE MODD_SALT, ONLY: LSALT, NMODE_SLT use modd_station_n, only: tstations_time use modd_type_statprof, only: tstationdata -USE MODE_AERO_PSD -USE MODE_DUST_PSD -USE MODE_SALT_PSD -use mode_sensor, only: Add_fixpoint, Add_point, Sensor_current_processes_number_get, & +use mode_sensor, only: Add_dust_data, Add_fixpoint, Add_orilam_data, Add_point, Add_salt_data, & + Sensor_current_processes_number_get, & ccomment, ctitle, cunit, xwork6, & Sensor_write_workarrays_allocate, Sensor_write_workarrays_deallocate use MODE_WRITE_DIACHRO, ONLY: Write_diachro @@ -60,13 +56,6 @@ TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION ! !* 0.2 declaration of local variables for diachro ! -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG -REAL, DIMENSION(:,:,:,:,:), ALLOCATABLE :: ZPTOTA -REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO -! -CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT ! comment string -CHARACTER(LEN=NMNHNAMELGTMAX) :: YTITLE ! title -! !!! do not forget to increment the IPROC value if you add diagnostic !!! INTEGER :: IPROC ! number of variables records !!! do not forget to increment the JPROC value if you add diagnostic !!! @@ -88,9 +77,9 @@ IF (LDIAG_SURFRAD_STAT) THEN IF(CRAD/="NONE") IPROC = IPROC + 8 IPROC = IPROC + 1 ! XSFCO2 term END IF -IF (LORILAM) IPROC = IPROC + JPMODE*(3+NSOA+NCARB+NSP) -IF (LDUST) IPROC = IPROC + NMODE_DST*3 -IF (LSALT) IPROC = IPROC + NMODE_SLT*3 +IF ( LORILAM ) IPROC = IPROC + JPMODE * ( 3 + NSOA + NCARB + NSP ) +IF ( LDUST ) IPROC = IPROC + NMODE_DST * 3 +IF ( LSALT ) IPROC = IPROC + NMODE_SLT * 3 IF ( CRAD /= 'NONE' ) IPROC = IPROC + 1 ISTORE = SIZE( TSTATIONS_TIME%TPDATES ) @@ -169,199 +158,9 @@ if ( nsv > 0 ) then END IF END DO - IF ((LORILAM).AND. .NOT.(ANY(TPSTATION%XP(1,:) == 0.))) THEN - ALLOCATE (ZSV(1,1,ISTORE,NSV_AER)) - ALLOCATE (ZRHO(1,1,ISTORE)) - ALLOCATE (ZN0(1,1,ISTORE,JPMODE)) - ALLOCATE (ZRG(1,1,ISTORE,JPMODE)) - ALLOCATE (ZSIG(1,1,ISTORE,JPMODE)) - ALLOCATE (ZPTOTA(1,1,ISTORE,NSP+NCARB+NSOA,JPMODE)) - ZSV(1,1,:,1:NSV_AER) = TPSTATION%XSV(1,:,NSV_AERBEG:NSV_AEREND) - IF (SIZE(TPSTATION%XR,3) >0) THEN - ZRHO(1,1,:) = 0. - DO JRR=1,SIZE(TPSTATION%XR,3) - ZRHO(1,1,:) = ZRHO(1,1,:) + TPSTATION%XR(1,:,JRR) - ENDDO - ZRHO(1,1,:) = TPSTATION%XTH(1,:) * ( 1. + XRV/XRD*TPSTATION%XR(1,:,1) ) & - / ( 1. + ZRHO(1,1,:) ) - ELSE - ZRHO(1,1,:) = TPSTATION%XTH(1,:) - ENDIF - ZRHO(1,1,:) = TPSTATION%XP(1,:) / & - (XRD *ZRHO(1,1,:) *((TPSTATION%XP(1,:)/XP00)**(XRD/XCPD)) ) - - CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0,PCTOTA=ZPTOTA) - - DO JSV=1,JPMODE - ! mean radius - WRITE(YTITLE,'(A6,I1)')'AERRGA',JSV - WRITE(YCOMMENT,'(A18,I1)')'RG (nb) AERO MODE ',JSV - call Add_point( ytitle, ycomment, 'um', ZRG(1,1,:,JSV) ) - - ! standard deviation - WRITE(YTITLE,'(A7,I1)')'AERSIGA',JSV - WRITE(YCOMMENT,'(A16,I1)')'SIGMA AERO MODE ',JSV - call Add_point( ytitle, ycomment, '',ZSIG(1,1,:,JSV) ) - - ! particles number - WRITE(YTITLE,'(A6,I1)')'AERN0A',JSV - WRITE(YCOMMENT,'(A13,I1)')'N0 AERO MODE ',JSV - call Add_point( ytitle, ycomment, 'm-3', ZN0(1,1,:,JSV) ) - - WRITE(YTITLE,'(A5,I1)')'MOC ',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS OC AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_OC,JSV) ) - - WRITE(YTITLE,'(A5,I1)')'MBC ',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS BC AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_BC,JSV) ) - - WRITE(YTITLE,'(A5,I1)')'MDST ',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS DST AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_DST,JSV) ) - - WRITE(YTITLE,'(A5,I1)')'MSO4 ',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS SO4 AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SO4,JSV) ) - - WRITE(YTITLE,'(A5,I1)')'MNO3 ',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS NO3 AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_NO3,JSV) ) - - WRITE(YTITLE,'(A5,I1)')'MH2O ',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS H2O AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_H2O,JSV) ) - - WRITE(YTITLE,'(A5,I1)')'MNH3 ',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS NH3 AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_NH3,JSV) ) - - IF ( NSOA == 10 ) THEN - WRITE(YTITLE,'(A5,I1)')'MSOA1',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS SOA1 AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA1,JSV) ) - - WRITE(YTITLE,'(A5,I1)')'MSOA2',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS SOA2 AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA2,JSV) ) - - WRITE(YTITLE,'(A5,I1)')'MSOA3',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS SOA3 AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA3,JSV) ) - - WRITE(YTITLE,'(A5,I1)')'MSOA4',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS SOA4 AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA4,JSV) ) - - WRITE(YTITLE,'(A5,I1)')'MSOA5',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS SOA5 AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA5,JSV) ) - - WRITE(YTITLE,'(A5,I1)')'MSOA6',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS SOA6 AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA6,JSV) ) - - WRITE(YTITLE,'(A5,I1)')'MSOA7',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS SOA7 AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA7,JSV) ) - - WRITE(YTITLE,'(A5,I1)')'MSOA8',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS SOA8 AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA8,JSV) ) - - WRITE(YTITLE,'(A5,I1)')'MSOA9',JSV - WRITE(CCOMMENT,'(A23,I1)')'MASS SOA9 AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA9,JSV) ) - - WRITE(YTITLE,'(A6,I1)')'MSOA10',JSV - WRITE(CCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JSV - call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA10,JSV) ) - END IF - END DO - - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG) - END IF - - IF ((LDUST).AND. .NOT.(ANY(TPSTATION%XP(1,:) == 0.))) THEN - ALLOCATE (ZSV(1,1,ISTORE,NSV_DST)) - ALLOCATE (ZRHO(1,1,ISTORE)) - ALLOCATE (ZN0(1,1,ISTORE,NMODE_DST)) - ALLOCATE (ZRG(1,1,ISTORE,NMODE_DST)) - ALLOCATE (ZSIG(1,1,ISTORE,NMODE_DST)) - ZSV(1,1,:,1:NSV_DST) = TPSTATION%XSV(1,:,NSV_DSTBEG:NSV_DSTEND) - IF (SIZE(TPSTATION%XR,3) >0) THEN - ZRHO(1,1,:) = 0. - DO JRR=1,SIZE(TPSTATION%XR,3) - ZRHO(1,1,:) = ZRHO(1,1,:) + TPSTATION%XR(1,:,JRR) - ENDDO - ZRHO(1,1,:) = TPSTATION%XTH(1,:) * ( 1. + XRV/XRD*TPSTATION%XR(1,:,1) ) & - / ( 1. + ZRHO(1,1,:) ) - ELSE - ZRHO(1,1,:) = TPSTATION%XTH(1,:) - ENDIF - ZRHO(1,1,:) = TPSTATION%XP(1,:) / & - (XRD *ZRHO(1,1,:) *((TPSTATION%XP(1,:)/XP00)**(XRD/XCPD)) ) - CALL PPP2DUST(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0) - DO JSV=1,NMODE_DST - ! mean radius - WRITE( YTITLE, '( A6, I1 )' ) 'DSTRGA', JSV - WRITE( YCOMMENT, '( A18, I1 )' ) 'RG (nb) DUST MODE ', JSV - call Add_point( ytitle, ycomment, 'um', ZRG(1,1,:,JSV) ) - - ! standard deviation - WRITE( YTITLE, '( A7, I1 )' ) 'DSTSIGA', JSV - WRITE( YCOMMENT, '( A16, I1 )' ) 'SIGMA DUST MODE ', JSV - call Add_point( ytitle, ycomment, '', ZSIG(1,1,:,JSV) ) - - ! particles number - WRITE( YTITLE, '( A6, I1 )' ) 'DSTN0A', JSV - WRITE( YCOMMENT, '( A13, I1 )' ) 'N0 DUST MODE ', JSV - call Add_point( ytitle, ycomment, 'm-3', ZN0(1,1,:,JSV) ) - ENDDO - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG) - END IF - - IF ((LSALT).AND. .NOT.(ANY(TPSTATION%XP(1,:) == 0.))) THEN - ALLOCATE (ZSV(1,1,ISTORE,NSV_SLT)) - ALLOCATE (ZRHO(1,1,ISTORE)) - ALLOCATE (ZN0(1,1,ISTORE,NMODE_SLT)) - ALLOCATE (ZRG(1,1,ISTORE,NMODE_SLT)) - ALLOCATE (ZSIG(1,1,ISTORE,NMODE_SLT)) - ZSV(1,1,:,1:NSV_SLT) = TPSTATION%XSV(1,:,NSV_SLTBEG:NSV_SLTEND) - IF (SIZE(TPSTATION%XR,3) >0) THEN - ZRHO(1,1,:) = 0. - DO JRR=1,SIZE(TPSTATION%XR,3) - ZRHO(1,1,:) = ZRHO(1,1,:) + TPSTATION%XR(1,:,JRR) - ENDDO - ZRHO(1,1,:) = TPSTATION%XTH(1,:) * ( 1. + XRV/XRD*TPSTATION%XR(1,:,1) ) & - / ( 1. + ZRHO(1,1,:) ) - ELSE - ZRHO(1,1,:) = TPSTATION%XTH(1,:) - ENDIF - ZRHO(1,1,:) = TPSTATION%XP(1,:) / & - (XRD *ZRHO(1,1,:) *((TPSTATION%XP(1,:)/XP00)**(XRD/XCPD)) ) - CALL PPP2SALT(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0) - DO JSV=1,NMODE_SLT - ! mean radius - WRITE( YTITLE, '( A6, I1 )' ) 'SLTRGA', JSV - WRITE( YCOMMENT, '( A18, I1 )' ) 'RG (nb) SALT MODE ', JSV - call Add_point( ytitle, ycomment, 'um', ZRG(1,1,:,JSV) ) - - ! standard deviation - WRITE( YTITLE, '( A7, I1 )' ) 'SLTSIGA', JSV - WRITE( YCOMMENT, '( A16, I1 )' ) 'SIGMA DUST MODE ', JSV - call Add_point( ytitle, ycomment, '',ZSIG(1,1,:,JSV) ) - - ! particles number - WRITE( YTITLE, '( A6, I1 )' ) 'SLTN0A', JSV - WRITE( YCOMMENT, '( A13, I1 )' ) 'N0 DUST MODE ', JSV - call Add_point( ytitle, ycomment, 'm-3', ZN0(1,1,:,JSV) ) - ENDDO - DEALLOCATE (ZSV,ZRHO) - DEALLOCATE (ZN0,ZRG,ZSIG) - END IF + if ( lorilam ) call Add_orilam_data( tpstation, 1, istore ) + if ( ldust ) call Add_dust_data ( tpstation, 1, istore ) + if ( lsalt ) call Add_salt_data ( tpstation, 1, istore ) end if if ( crad /= 'NONE' ) call Add_point( 'Tsrad', 'Radiative Surface Temperature', 'K', tpstation%xtsrad(:) )