New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 1991 for vendors/IOIPSL/current/src/mathelp.f90 – NEMO

Ignore:
Timestamp:
2010-07-08T15:39:26+02:00 (14 years ago)
Author:
smasson
Message:

Load working_directory into vendors/IOIPSL/current.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vendors/IOIPSL/current/src/mathelp.f90

    r1895 r1991  
    11MODULE mathelp 
    22!- 
    3 !$Id: mathelp.f90 440 2008-11-26 10:58:38Z bellier $ 
     3!$Id: mathelp.f90 845 2009-12-10 16:26:03Z bellier $ 
    44!- 
    55! This software is governed by the CeCILL license 
     
    2828CONTAINS 
    2929!=== 
    30 SUBROUTINE buildop (str,ex_topps,topp,nbops_max, & 
    31  &                  missing_val,opps,scal,nbops) 
     30SUBROUTINE buildop (c_str,ex_topps,topp,fill_val,opps,scal,nbops) 
    3231!--------------------------------------------------------------------- 
    3332!- This subroutine decomposes the input string in the elementary 
     
    3938!- INPUT 
    4039!- 
    41 !- str      : String containing the operations 
    42 !- ex_toops : The time operations that can be expected 
    43 !-            within the string 
     40!- c_str    : String containing the operations 
     41!- ex_toops : Time operations that can be expected within the string 
     42!- fill_val : 
    4443!- 
    4544!- OUTPUT 
    4645!- 
    47 !--------------------------------------------------------------------- 
    48   IMPLICIT NONE 
    49 !- 
    50   CHARACTER(LEN=80) :: str 
    51   CHARACTER(LEN=*) :: ex_topps 
    52   CHARACTER(LEN=7) :: topp 
    53   INTEGER :: nbops_max,nbops 
    54   CHARACTER(LEN=7) :: opps(nbops_max) 
    55   REAL :: scal(nbops_max),missing_val 
    56 !- 
    57   CHARACTER(LEN=80) :: new_str 
     46!- topp   : Time operation 
     47!- opps   : 
     48!- scal   : 
     49!- nbops  : 
     50!--------------------------------------------------------------------- 
     51  IMPLICIT NONE 
     52!- 
     53  CHARACTER(LEN=*),INTENT(IN) :: c_str,ex_topps 
     54  CHARACTER(LEN=*),INTENT(OUT) :: topp 
     55  CHARACTER(LEN=*),DIMENSION(:),INTENT(OUT) :: opps 
     56  REAL,INTENT(IN) :: fill_val 
     57  REAL,DIMENSION(:),INTENT(OUT) :: scal 
     58  INTEGER,INTENT(OUT) :: nbops 
     59!- 
     60  CHARACTER(LEN=LEN(c_str)) :: str,new_str 
    5861  INTEGER :: leng,ind_opb,ind_clb 
    5962!- 
     
    6265  IF (check) WRITE(*,*) 'buildop : Some preliminary cleaning' 
    6366!- 
     67  str = c_str 
    6468  leng = LEN_TRIM(str) 
    6569  IF ( str(1:1) == '(' .AND. str(leng:leng) == ')' ) THEN 
     
    9498 &          ' buildop : Call decoop ',new_str,ind_opb,ind_clb 
    9599        ENDIF 
    96         CALL decoop (new_str,nbops_max,missing_val,opps,scal,nbops) 
     100        CALL decoop (new_str,fill_val,opps,scal,nbops) 
    97101      ELSE 
    98102        CALL ipslerr(3,'buildop', & 
     
    115119END SUBROUTINE buildop 
    116120!=== 
    117 SUBROUTINE decoop (pstr,nbops_max,missing_val,opps,scal,nbops) 
    118 !--------------------------------------------------------------------- 
    119   IMPLICIT NONE 
    120 !- 
    121   CHARACTER(LEN=80) :: pstr 
    122   INTEGER :: nbops_max,nbops 
    123   CHARACTER(LEN=7) :: opps(nbops_max) 
    124   REAL :: scal(nbops_max),missing_val 
    125 !- 
    126   CHARACTER(LEN=1) :: f_char(2),s_char(2) 
    127   INTEGER :: nbsep,f_pos(2),s_pos(2) 
     121SUBROUTINE decoop (pstr,fill_val,opps,scal,nbops) 
     122!--------------------------------------------------------------------- 
     123  IMPLICIT NONE 
     124!- 
     125  CHARACTER(LEN=*),INTENT(IN) :: pstr 
     126  REAL,INTENT(IN) :: fill_val 
     127  CHARACTER(LEN=*),DIMENSION(:),INTENT(OUT) :: opps 
     128  REAL,DIMENSION(:),INTENT(OUT) :: scal 
     129  INTEGER,INTENT(OUT) :: nbops 
     130!- 
     131  CHARACTER(LEN=1),DIMENSION(2) :: f_char,s_char 
     132  INTEGER,DIMENSION(2) :: f_pos,s_pos 
    128133  CHARACTER(LEN=20) :: opp_str,scal_str 
    129   CHARACTER(LEN=80) :: str 
    130   INTEGER :: xpos,leng,ppos,epos,int_tmp 
     134  CHARACTER(LEN=LEN(pstr)) :: str 
     135  INTEGER :: nbsep,nbops_max,xpos,leng,ppos,epos,int_tmp 
    131136  CHARACTER(LEN=3) :: tl,dl 
    132137  CHARACTER(LEN=10) :: fmt 
     
    134139  LOGICAL :: check = .FALSE.,prio 
    135140!--------------------------------------------------------------------- 
    136   IF (check) WRITE(*,'(2a)') ' decoop : Incoming string : ',pstr 
    137 !- 
    138   nbops = 0 
    139   str = pstr 
     141  IF (check) WRITE(*,'(2A)') ' decoop : Incoming string : ',pstr 
     142!- 
     143  str = pstr; nbops = 0; 
    140144!- 
    141145  CALL findsep (str,nbsep,f_char,f_pos,s_char,s_pos) 
    142146  IF (check) WRITE(*,*) 'decoop : Out of findsep',nbsep 
     147!- 
     148  nbops_max = min(SIZE(opps),SIZE(scal)) 
     149!- 
    143150  DO WHILE (nbsep > 0) 
     151    IF (nbops >= nbops_max) THEN 
     152      CALL ipslerr(3,'decoop','Expression too complex',TRIM(str),' ') 
     153    ENDIF 
     154!-- 
    144155    xpos = INDEX(str,'X') 
    145156    leng = LEN_TRIM(str) 
     
    147158!-- 
    148159    IF (check) THEN 
    149       WRITE(*,*) 'decoop : str -->',str(1:leng) 
     160      WRITE(*,*) 'decoop : str   -> ',TRIM(str) 
     161      WRITE(*,*) 'decoop : nbops -> ',nbops 
    150162      WRITE(*,*) s_char(1),'-',f_char(1),'|',f_char(2),'-',s_char(2) 
    151163      WRITE(*,*) s_pos(1),'-',f_pos(1),'|',f_pos(2),'-',s_pos(2) 
    152164    ENDIF 
    153 !-- 
    154     IF (nbops > nbops_max-1) THEN 
    155       CALL ipslerr(3,'decoop','Expression too complex',str,' ') 
    156     ENDIF 
    157 !-- 
    158     IF (check) WRITE(*,*) 'decoop : --',nbops,' ',str(1:leng) 
    159165!--- 
    160166!-- Start the analysis of the syntax. 3 types of constructs 
     
    236242      IF (INDEX(funcs,opp_str(1:LEN_TRIM(opp_str))) > 0) THEN 
    237243        opps(nbops) = opp_str(1:LEN_TRIM(opp_str)) 
    238         scal(nbops) =  missing_val 
     244        scal(nbops) = fill_val 
    239245      ELSE 
    240246        CALL ipslerr(3,'decoop', & 
     
    313319  IMPLICIT NONE 
    314320!- 
    315   CHARACTER(LEN=80) :: str 
     321  CHARACTER(LEN=*),INTENT(INOUT) :: str 
    316322  INTEGER :: nbsep 
    317323  CHARACTER(LEN=1),DIMENSION(2) :: f_char,s_char 
    318324  INTEGER,DIMENSION(2) :: f_pos,s_pos 
    319325!- 
    320   CHARACTER(LEN=70) :: str_tmp 
     326  CHARACTER(LEN=10) :: str_tmp 
    321327  LOGICAL :: f_found,s_found 
    322328  INTEGER :: ind,xpos,leng,i 
     
    385391    WRITE(str_tmp,'("number :",I3)') nbsep 
    386392    CALL ipslerr(3,'findsep', & 
    387  &    'How can I find that many separators',str_tmp,str) 
     393 &    'How can I find that many separators',str_tmp,TRIM(str)) 
    388394  ENDIF 
    389395!- 
     
    399405  IMPLICIT NONE 
    400406!- 
    401   CHARACTER(LEN=80) :: str 
     407  CHARACTER(LEN=*),INTENT(INOUT) :: str 
    402408!- 
    403409  INTEGER :: ind,leng,ic,it 
Note: See TracChangeset for help on using the changeset viewer.