JCSDA / CRTMv3

CRTMv3 repository for coordinated development and releases. Code history is not carried in this repository prior to v3, to reduce the cloning overhead. For v2.x history leading up to v3, see JCSDA/crtm repository.
Other
6 stars 6 forks source link

Create supporting packages for aerosol/cloud/total optical profiles required for CRTM generic interface #110

Open chengdang opened 9 months ago

chengdang commented 9 months ago

Per issue #107 #108, CRTM plans to enable user-defined optical profiles for CRTM calculations. It is useful to provide supporting packages for computing optical profiles suitable for CRTM simulations.

For now, we only plan to create packages that adopt CRTM inputs and aerosol/cloud LUTs to generate:

chengdang commented 7 months ago

The first version of OP implementation has been uploaded to branch: Feature/cd generic itf

The supporting packages for aerosol/cloud/total optical profiles are still under testing. My initial hope was to create a python-based package completely independent from the CRTM source code, but it has proven to be very tricky, mostly due to the need of adding extra layers (function CRTM_Atmosphere_AddLayers) given input profiles and the standard climatological profiles. A fortran-based package built upon the existing CRTM functionality is more practical at this point.

chengdang commented 7 months ago

The other option is to create a python-based package, with the extrapolation of pressure only. From the existing CRTM function, the cloud and aerosol related state variables are all set as zeros in the extrapolated layers:

    ! Slot the added layers into the output atmosphere structure
    ! Note: Cloud and Aerosol assignments not really needed (the
    !       zeroing is handled by the structure allocation) since
    !       at TOA, typically, there are not any clouds and/or
    !       aerosols.
    ! ...Profile
    Atm_Out%Level_Pressure(0:n) = iAtm%pl
    Atm_Out%Pressure(1:n)       = iAtm%p
    Atm_Out%Temperature(1:n)    = iAtm%t
    Atm_Out%Cloud_Fraction(1:n) = ZERO
    DO j = 1, Atm_Out%n_Absorbers
      Atm_Out%Absorber(1:n,j)   = iAtm%a(:,j)
    END DO
    ! ...Clouds
    IF ( Atm_In%n_Clouds > 0 ) THEN
      DO i = 1, Atm_In%n_Clouds
        Atm_Out%Cloud(i)%Effective_Radius(1:n)   = ZERO
        Atm_Out%Cloud(i)%Effective_Variance(1:n) = ZERO
        Atm_Out%Cloud(i)%Water_Content(1:n)      = ZERO
        Atm_Out%Cloud(i)%Water_Density(1:n)      = ZERO
      END DO
    END IF
    ! ...Aerosols
    IF ( Atm_In%n_Aerosols > 0 ) THEN
      DO i = 1, Atm_In%n_Aerosols
        Atm_Out%Aerosol(i)%Effective_Radius(1:n) = ZERO
        Atm_Out%Aerosol(i)%Concentration(1:n)    = ZERO
      END DO
    END IF