Changeset 874


Ignore:
Timestamp:
05/27/19 15:56:37 (5 years ago)
Author:
jisesh
Message:

devel : Nudging towards external data using XIOS

Location:
codes/icosagcm/devel/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/src/dissip/guided_mod.f90

    r820 r874  
    22 
    33  CHARACTER(LEN=255),SAVE :: guided_type 
     4  CHARACTER(LEN=255),SAVE :: guided_nudging_field 
    45!$OMP THREADPRIVATE(guided_type) 
    56 
  • codes/icosagcm/devel/src/dissip/nudging_mod.f90

    r820 r874  
    1717  TYPE(t_field),POINTER :: f_relax_coef_e(:), f_target_ue(:), & 
    1818       f_relax_coef_i(:), f_target_theta_rhodz(:) 
     19  CHARACTER(LEN=255),SAVE :: guided_nudging_field 
     20  INTEGER,SAVE :: nudging_time 
    1921 
    2022  PUBLIC :: init_guided, guided 
     
    3941    CALL getin('nudging_radius', nudging_radius) 
    4042    nudging_radius = nudging_radius / scale_factor 
    41 !    time=0. 
    42 !    CALL getin('nudging_time', time) 
     43 
     44    nudging_time=0. 
     45    CALL getin('nudging_time', nudging_time) 
    4346 
    4447    ! we should check that radius>0 
    45  
    46     !SELECT CASE(TRIM(nudg_name)) 
    47     !    CASE ('f_u') 
    48         CALL allocate_field(f_relax_coef_e, field_u, type_real, name='nudging_coef_e') 
    49         CALL allocate_field(f_target_ue, field_u, type_real, llm, name='nudging_target_e') 
    50     !    CASE ('f_theta_rhodz') 
    51         CALL allocate_field(f_relax_coef_i, field_t, type_real, name='nudging_coef_i') 
    52         CALL allocate_field(f_target_theta_rhodz, field_t, type_real, llm,nqdyn, name='nudging_target_theta') 
    53     !    CASE DEFAULT 
    54     !END SELECT 
     48    CALL getin("guided_nudging_field",guided_nudging_field) 
     49 
     50    SELECT CASE(TRIM(guided_nudging_field)) 
     51        CASE ('wind') 
     52            CALL allocate_field(f_relax_coef_e, field_u, type_real, name='nudging_coef_e') 
     53            CALL allocate_field(f_target_ue, field_u, type_real, llm, name='nudging_target_e') 
     54        CASE ('temperature') 
     55            CALL allocate_field(f_relax_coef_i, field_t, type_real, name='nudging_coef_i') 
     56            CALL allocate_field(f_target_theta_rhodz, field_t, type_real, llm,nqdyn, name='nudging_target_theta') 
     57        CASE ('wind_temperature') 
     58            CALL allocate_field(f_relax_coef_e, field_u, type_real, name='nudging_coef_e') 
     59            CALL allocate_field(f_target_ue, field_u, type_real, llm, name='nudging_target_e') 
     60            CALL allocate_field(f_relax_coef_i, field_t, type_real, name='nudging_coef_i') 
     61            CALL allocate_field(f_target_theta_rhodz, field_t, type_real, llm,nqdyn, name='nudging_target_theta') 
     62        CASE DEFAULT 
     63                 PRINT*,"Bad selector for varaible init_guided_nudging>",TRIM(guided_nudging_field) 
     64                 PRINT*," option are <none>, <wind>, <temperature>,<wind_temperature>" 
     65                 STOP 
     66    END SELECT 
    5567 
    5668    ! compute relax_coef and target_ue 
     
    94106    CALL dist_lonlat(lon, lat, center_lon, center_lat, dist)  
    95107    c = tanh((1.-radius*dist/nudging_radius)*20.) ! 1 inside circle, -1 outside 
     108    IF (c>0.99) c=1 
     109    IF (c<-0.99) c=-1 
    96110    relax_coef = .5*(1.+c) ! rescale to [0,1] range ; ! 1 inside circle, 0 outside 
    97111  END FUNCTION relax_coef 
     
    128142   
    129143  SUBROUTINE guided(tt, f_ps, f_theta_rhodz, f_u, f_q) 
     144    USE xios_mod 
     145    USE theta2theta_rhodz_mod 
     146    USE wind_mod 
     147    USE transfert_mod 
     148    USE time_mod 
     149    USE pression_mod 
    130150    REAL(rstd), INTENT(IN):: tt 
    131151    TYPE(t_field),POINTER :: f_ps(:) 
     
    133153    TYPE(t_field),POINTER :: f_theta_rhodz(:) 
    134154    TYPE(t_field),POINTER :: f_u(:)   
    135     TYPE(t_field),POINTER :: f_q(:)   
     155    TYPE(t_field),POINTER :: f_q(:)  
     156    TYPE(t_field),POINTER :: f_T_guided(:),  f_ulon_guided(:), f_ulat_guided(:),f_pressure_mid(:)  
    136157    REAL(rstd), POINTER :: target_ue(:,:), ue(:,:), coef_e(:) 
    137158    REAL(rstd), POINTER :: target_theta_rhodz(:,:,:), theta_rhodz(:,:,:), coef_i(:)  
    138159    INTEGER :: ind 
     160 
     161    IF (MOD(INT(tt),nudging_time)==dt) THEN 
     162    
     163      CALL allocate_field(f_T_guided, field_t, type_real, llm, name='nudging_T') 
     164      CALL allocate_field(f_ulon_guided, field_t, type_real, llm, name='nudging_ulon') 
     165      CALL allocate_field(f_ulat_guided, field_t, type_real, llm, name='nudging_ulat') 
     166 
     167      CALL xios_read_field("T_guided_read",f_T_guided) 
     168      CALL transfert_request(f_T_guided,req_i0) 
     169      CALL temperature2theta_rhodz(f_ps,f_T_guided,f_target_theta_rhodz) 
     170      CALL xios_read_field("ulon_guided_read",f_ulon_guided) 
     171      CALL xios_read_field("ulat_guided_read",f_ulat_guided) 
     172      CALL transfert_request(f_ulon_guided,req_i0) 
     173      CALL transfert_request(f_ulat_guided,req_i0) 
     174      CALL transfert_request(f_ulon_guided,req_i1) 
     175      CALL transfert_request(f_ulat_guided,req_i1) 
     176      CALL xios_write_field("ulat_guided_out",f_ulat_guided) 
     177      CALL xios_write_field("ulon_guided_out",f_ulon_guided) 
     178      CALL ulonlat2un(f_ulon_guided, f_ulat_guided,f_target_ue) 
     179 
     180      CALL deallocate_field(f_T_guided) 
     181      CALL deallocate_field(f_ulon_guided) 
     182      CALL deallocate_field(f_ulat_guided) 
     183     
     184    ENDIF 
     185 
    139186 
    140187    DO ind = 1 , ndomain 
  • codes/icosagcm/devel/src/output/xios_mod.F90

    r726 r874  
    4848 USE time_mod 
    4949 USE metric, ONLY : vup,vdown, cell_glo 
     50 USE disvert_mod, ONLY : presnivs 
    5051 IMPLICIT NONE 
    5152  TYPE(xios_context) :: ctx_hdl 
     
    7071   CALL xios_set_axis_attr("lev",n_glo=llm ,value=lev_value) ; 
    7172   CALL xios_set_axis_attr("levp1",n_glo=llm+1 ,value=lev_valuep1) ; 
     73   CALL xios_set_axis_attr("presnivs_mb",n_glo=llm, value=presnivs/100., unit="mb") ;  
    7274   CALL xios_set_axis_attr("nq",n_glo=nqtot, value=nq_value) ; 
    7375    
Note: See TracChangeset for help on using the changeset viewer.