anchor.diff:      call CONVIP_plus( ip, p, kind, mode2,string,.false.)
   end subroutine C_CONV_IP
   !===============================================================================================
  -! successeur de convip
  +!****f* rmnlib/convip_plus
  +! SUMMARY
  +!  successeur de convip,  Codage/Decodage P,kind <-> IP pour IP1, IP2, IP3
  +!  necessaire avant de lire/ecrire un enregistrement sur un fichier standard.
  +! SYNOPSIS
   SUBROUTINE CONVIP_plus( ip, p, kind, mode, string, flagv )
     implicit none
  +! ARGUMENTS
     integer, intent(INOUT) :: ip, kind
     integer, intent(IN) :: mode
     real, intent(INOUT) :: p
     character *(*), intent(OUT) :: string 
     logical, intent(IN) :: flagv
   
  -!*********************************************************************
  -!     Codage/Decodage P de/a IP pour IP1, IP2, IP3
  -!     necessaire avant de lire/ecrire un enregistrement
  -!     sur un fichier standard.
  -!
  -!     Etendue des valeurs encodes: 10e-5 -> 10e10
  -!     1024x1024-1 = 1048575    1048001 -> 1048575 non utilise
  -!                              1000000 -> 1048000 utilise pour valeurs negatives
  -!
  +! Notes
  +!
  +!  Etendue des valeurs reelles encodees: 10e-5 -> 10e10
  +!  pseudo mantisses :
  +!  1024x1024-1 = 1048575
  +!  1048001 -> 1048575 non utilise
  +!  1000001 -> 1048000 utilise pour valeurs negatives
  +! AUTHOR
   !     Auteurs: N. Ek et B. Dugas - Mars 1996
   !     Revision 001  M. Lepine - juin 1997 convpr devient convip
   !     Revision 002  M. Valin  - mai  1998 fichiers std 98
  
positive.code:   return
  end function encode_ip_0
  !===============================================================================================
  !
  ! produce valid (real value,kind) pairs from (ip1,ip2,ip3) triplet
  ! ip1/2/3 should be encoded "new style" but old style encoding is accepted
  ! RP1 will contain a level (or a pair of levels in atmospheric ascending order) in the atmosphere
  ! RP2 will contain a time (or a pair of times in ascending order)
  ! RP3%hi will be the same as RP3%lo (if RP1 or RP2 contains a pair, RP3 is ignoref)
  ! this routine is C interoperable
  !
  ! function returns:  CONVERT_ERROR        error, (ip1 not level, ip2 not time, etc...)
  !                    CONVERT_OK           everything is OK
  !                    CONVERT_GOOD_GUESS   old style ip1 and/or ip2 are present
  !                    CONVERT_BAD_GUESS    old style ip3, interpreted as time
  !                    CONVERT_TERRIBLE_GUESS old style ip3, interpreted as arbitrary code
  !
  ! in case of error, RP1/2/3 are undefined (may contain anything)
  !
  !notes: some reordering may take place when RP1 or RP2 contains a pair
  !       levels: ip1 will be lower in atmosphere than ip2
  !       times:  ip2 will be the end of the time range, ip3 will be the start of the time range
  !
  !       ip1 not a level or ip2 not a time will be flagged as an error
  !       RP1 and RP2 both containing a range will be flagged as an error
  !       in case of error, ip1,2,3 will be returned as -1
  !
  function decode_ip_0(RP1,RP2,RP3,IP1V,IP2V,IP3V) result(status) BIND (C,name='DecodeIp')
    implicit none ! coupled (ip1,ip2,ip3) to (rp1,rp2,rp3) conversion with type enforcement
  
    integer(C_INT) :: status
    integer(C_INT), value, intent(IN)  :: IP1V,IP2V,IP3V
    type(float_ip), intent(OUT) :: RP1,RP2,RP3
  
    real*4, dimension(3) :: P
    integer, dimension(3) ::kind
  
negative.code: ! total failure if we get here
    return
  end function conv_kind_15
  !============================= end of private function =========================================
  !===============================================================================================
  !****f* rmnlib/value_to_string
  ! SUMMARY
  ! write value val into string using at most maxlen characters
  ! SYNOPSIS
  integer function value_to_string(val,string,maxlen)  
  ! AUTHOR
  !  M.Valin 2013
  !  Revision 001 :  M.Valin  Oct 2013 alignement a droite corrige pour valeurs entieres > 0
  ! ARGUMENTS
    integer, intent(IN) :: maxlen
    character (len=*), intent(OUT) :: string
    real *4, intent(IN) :: val
  ! INPUTS
  !  maxlen : use at most maxlen characters to code value
  !  val    : real value to be encoded (left aligned) into string
  ! OUTPUTS
  !  string : result of encoding
  ! RESULT
  !  if something went wrong, the return value will be <= 0
  !  if an integer format (I) is used, the return value is the number of characters used
  !  if a floating format (F/G) is used, return value =- 100*field_width + nb_of_significant_digits
  !  ex: if F8.3 is used, the result will be 803, if I6 is used, the result will be 6
  !******
    character (len=32) :: fstring
    real *4 :: value
    integer :: after, before
    integer :: grosint, maxc, intdig
  
  