Changeset 93


Ignore:
Timestamp:
08/03/12 23:36:22 (12 years ago)
Author:
ymipsl
Message:

Add "once" functionnlity to writefield

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/write_field.f90

    r82 r93  
    6161    end function GetFieldIndex 
    6262     
    63     SUBROUTINE Writefield(name_in,field,nind) 
     63    SUBROUTINE Writefield(name_in,field,nind,once) 
    6464    USE domain_mod 
    6565    USE field_mod 
     
    7171      TYPE(t_field),POINTER :: field(:) 
    7272      INTEGER,OPTIONAL,INTENT(IN) :: nind 
     73      LOGICAL,OPTIONAL,INTENT(IN) :: once 
     74       
    7375      TYPE(t_field),POINTER :: field_glo(:) 
    7476       
     
    8587      IF (mpi_rank==0) THEN 
    8688        IF (PRESENT(nind)) THEN 
    87          CALL writefield_gen(name_in,field_glo,domain_glo,nind) 
     89         CALL writefield_gen(name_in,field_glo,domain_glo,nind,once=once) 
    8890        ELSE 
    89          CALL writefield_gen(name_in,field_glo,domain_glo,1,ndomain_glo) 
     91         CALL writefield_gen(name_in,field_glo,domain_glo,1,ndomain_glo,once=once) 
    9092        ENDIF 
    9193      ENDIF 
     
    320322 
    321323 
    322     SUBROUTINE Writefield_gen(name_in, field, domain_type, ind_b_in, ind_e_in ) 
     324    SUBROUTINE Writefield_gen(name_in, field, domain_type, ind_b_in, ind_e_in,once ) 
    323325    USE netcdf_mod 
    324326    USE domain_mod 
     
    335337      REAL(r8),ALLOCATABLE :: field_val3d(:,:) 
    336338      REAL(r8),ALLOCATABLE :: field_val4d(:,:,:) 
     339      LOGICAL,OPTIONAL, INTENT(IN) :: once 
    337340      TYPE(t_domain),POINTER :: d 
    338341      INTEGER :: Index 
     
    375378      Index=GetFieldIndex(name) 
    376379      if (Index==-1) then 
    377         call create_header_gen(name_in,field,domain_type,ind_b_in,ind_e_in) 
     380        call create_header_gen(name_in,field,domain_type,ind_b_in,ind_e_in,once) 
    378381        Index=GetFieldIndex(name) 
    379382      else 
     
    408411            ENDDO 
    409412          ENDDO 
    410           status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val2d,  & 
    411                               start=(/ 1,FieldIndex(Index) /),count=(/ncell,1 /)) 
     413 
     414          IF (PRESENT(once) .AND. once) THEN  
     415            status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val2d,  & 
     416                               start=(/ 1 /),count=(/ncell /)) 
     417          ELSE 
     418            status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val2d,  & 
     419                               start=(/ 1,FieldIndex(Index) /),count=(/ncell,1 /)) 
     420          ENDIF 
     421           
    412422          DEALLOCATE(field_val2d) 
    413423        ELSE IF (field(1)%ndim==3) THEN 
     
    427437          ENDDO 
    428438            
    429           status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,start=(/ 1,1,FieldIndex(Index) /),   & 
    430                                count=(/ncell,size(field(1)%rval3d,2),1 /)) 
     439          IF (PRESENT(once) .AND. once) THEN  
     440            status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,start=(/ 1,1 /),   & 
     441                                 count=(/ncell,size(field(1)%rval3d,2) /)) 
     442          ELSE 
     443             status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,start=(/ 1,1,FieldIndex(Index) /),   & 
     444                                 count=(/ncell,size(field(1)%rval3d,2),1 /)) 
     445          ENDIF 
     446                                 
    431447          DEALLOCATE(field_val3d) 
    432448        ELSE IF (field(1)%ndim==4) THEN 
     
    449465            ENDDO 
    450466             
    451             status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d,start=(/ 1,1,FieldIndex(Index) /),   & 
    452                                count=(/ncell,size(field(1)%rval4d,2),1 /)) 
     467            IF (PRESENT(once) .AND. once) THEN  
     468              status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d,start=(/ 1,1 /),   & 
     469                                 count=(/ncell,size(field(1)%rval4d,2),1 /)) 
     470            ELSE 
     471              status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d,start=(/ 1,1,FieldIndex(Index) /),   & 
     472                                 count=(/ncell,size(field(1)%rval4d,2),1 /)) 
     473            ENDIF 
    453474            DEALLOCATE(field_val3d) 
    454475          ENDDO          
     
    503524          ENDDO 
    504525           
    505           status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),                       & 
    506                               Field_val2d,start=(/ 1,FieldIndex(Index) /),count=(/ncell,1 /)) 
     526          IF (PRESENT(once) .AND. once) THEN  
     527            status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),                       & 
     528                                Field_val2d,start=(/ 1 /),count=(/ncell /)) 
     529           ELSE 
     530            status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),                       & 
     531                                Field_val2d,start=(/ 1,FieldIndex(Index) /),count=(/ncell,1 /)) 
     532          ENDIF 
    507533          DEALLOCATE(field_val2d) 
    508534 
     
    529555          ENDDO 
    530556           
    531           status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,start=(/ 1,1,FieldIndex(Index) /),   & 
    532                               count=(/ncell,size(field(1)%rval3d,2),1 /)) 
     557          IF (PRESENT(once) .AND. once) THEN  
     558            status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,start=(/ 1,1 /),   & 
     559                                count=(/ncell,size(field(1)%rval3d,2) /)) 
     560          ELSE 
     561            status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,start=(/ 1,1,FieldIndex(Index) /),   & 
     562                                count=(/ncell,size(field(1)%rval3d,2),1 /)) 
     563          ENDIF 
    533564          DEALLOCATE(field_val3d) 
    534565         
     
    557588            ENDDO 
    558589 
    559             status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d,start=(/ 1,1,1,FieldIndex(Index) /),   & 
    560                                 count=(/ncell,size(field(1)%rval4d,2),1 /)) 
     590            IF (PRESENT(once) .AND. once) THEN  
     591              status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d,start=(/ 1,1,1 /),   & 
     592                                  count=(/ncell,size(field(1)%rval4d,2) /)) 
     593            ELSE 
     594              status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d,start=(/ 1,1,1,FieldIndex(Index) /),   & 
     595                                  count=(/ncell,size(field(1)%rval4d,2),1 /)) 
     596            ENDIF 
    561597            DEALLOCATE(field_val3d) 
    562598          ENDDO 
     
    11111147 
    11121148    
    1113     SUBROUTINE Create_header_gen(name_in,field,domain_type,ind_b_in,ind_e_in) 
     1149    SUBROUTINE Create_header_gen(name_in,field,domain_type,ind_b_in,ind_e_in,once) 
    11141150    USE netcdf_mod 
    11151151    USE field_mod 
     
    11251161      INTEGER,OPTIONAL,INTENT(IN) :: ind_b_in 
    11261162      INTEGER,OPTIONAL,INTENT(IN) :: ind_e_in 
     1163      LOGICAL,OPTIONAL,INTENT(IN) :: once 
     1164       
    11271165      INTEGER :: ncell 
    11281166      INTEGER :: nvert 
     
    12201258 
    12211259        IF (Field(ind_b)%ndim==2) THEN 
    1222           status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),ncprec,(/ ncellId,timeId /),FieldVarId(NbField)%nc_id(1)) 
     1260          IF (PRESENT(once) .AND. once) THEN  
     1261            status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),ncprec,(/ ncellId /),FieldVarId(NbField)%nc_id(1)) 
     1262          ELSE 
     1263             status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),ncprec,(/ ncellId,timeId /),FieldVarId(NbField)%nc_id(1)) 
     1264          ENDIF 
    12231265          status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon_i lat_i") 
    12241266        ELSE IF (Field(ind_b)%ndim==3) THEN 
    1225           status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),ncprec,(/ ncellId,dim3id,timeId /),FieldVarId(NbField)%nc_id(1)) 
     1267          IF (PRESENT(once) .AND. once) THEN  
     1268            status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),ncprec,(/ ncellId,dim3id /),FieldVarId(NbField)%nc_id(1)) 
     1269          ELSE 
     1270            status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),ncprec,(/ ncellId,dim3id,timeId /),FieldVarId(NbField)%nc_id(1)) 
     1271          ENDIF 
    12261272          status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon_i lat_i") 
    12271273        ELSE IF (Field(ind_b)%ndim==4) THEN 
    12281274          DO i=1,FieldVarId(NbField)%size 
    1229             status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name))//int2str(i),ncprec,(/ ncellId,dim3id,timeId /),  & 
    1230                                   FieldVarId(NbField)%nc_id(i)) 
     1275            IF (PRESENT(once) .AND. once) THEN  
     1276              status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name))//int2str(i),ncprec,(/ ncellId,dim3id /),  & 
     1277                                    FieldVarId(NbField)%nc_id(i)) 
     1278            ELSE 
     1279              status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name))//int2str(i),ncprec,(/ ncellId,dim3id,timeId /),  & 
     1280                                   FieldVarId(NbField)%nc_id(i)) 
     1281            ENDIF 
    12311282            status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(i),"coordinates","lon_i lat_i") 
    12321283          ENDDO         
     
    13311382 
    13321383        IF (Field(ind_b)%ndim==2) THEN 
    1333           status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),ncprec,(/ ncellId,timeId /),FieldVarId(NbField)%nc_id(1)) 
     1384          IF (PRESENT(once) .AND. once) THEN  
     1385            status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),ncprec,(/ ncellId /),FieldVarId(NbField)%nc_id(1)) 
     1386          ELSE 
     1387            status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),ncprec,(/ ncellId,timeId /),FieldVarId(NbField)%nc_id(1)) 
     1388          ENDIF 
    13341389          status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon_v lat_v") 
    13351390        ELSE IF (Field(ind_b)%ndim==3) THEN 
    1336           status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),ncprec,(/ ncellId,dim3id,timeId /),FieldVarId(NbField)%nc_id(1)) 
     1391          IF (PRESENT(once) .AND. once) THEN  
     1392            status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),ncprec,(/ ncellId,dim3id /),FieldVarId(NbField)%nc_id(1)) 
     1393          ELSE 
     1394            status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)),ncprec,(/ ncellId,dim3id,timeId /),FieldVarId(NbField)%nc_id(1)) 
     1395          ENDIF 
    13371396          status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(1),"coordinates","lon_v lat_v") 
    13381397        ELSE IF (Field(ind_b)%ndim==4) THEN 
    13391398          DO q=1,FieldVarId(NbField)%size 
    1340             status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)//int2str(q)),ncprec,             & 
    1341                                   (/ ncellId,dim3id,timeId /),FieldVarId(NbField)%nc_id(q)) 
     1399            IF (PRESENT(once) .AND. once) THEN  
     1400              status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)//int2str(q)),ncprec,             & 
     1401                                    (/ ncellId,dim3id /),FieldVarId(NbField)%nc_id(q)) 
     1402            ELSE 
     1403              status = NF90_DEF_VAR(ncid,TRIM(ADJUSTL(name)//int2str(q)),ncprec,             & 
     1404                                    (/ ncellId,dim3id,timeId /),FieldVarId(NbField)%nc_id(q)) 
     1405            ENDIF 
    13421406            status = NF90_PUT_ATT(ncid,FieldVarId(NbField)%nc_id(q),"coordinates","lon_v lat_v") 
    13431407          ENDDO         
Note: See TracChangeset for help on using the changeset viewer.