module_diffstar_lorene.f90 Source File


This file depends on

sourcefile~~module_diffstar_lorene.f90~~EfferentGraph sourcefile~module_diffstar_lorene.f90 module_diffstar_lorene.f90 sourcefile~module_diffstar_base.f90 module_diffstar_base.f90 sourcefile~module_diffstar_lorene.f90->sourcefile~module_diffstar_base.f90 sourcefile~module_id_base.f90 module_id_base.f90 sourcefile~module_diffstar_lorene.f90->sourcefile~module_id_base.f90 sourcefile~module_utility.f90 module_utility.f90 sourcefile~module_diffstar_lorene.f90->sourcefile~module_utility.f90 sourcefile~module_diffstar_base.f90->sourcefile~module_id_base.f90 sourcefile~module_diffstar_base.f90->sourcefile~module_utility.f90 sourcefile~module_id_base.f90->sourcefile~module_utility.f90

Files dependent on this one

sourcefile~~module_diffstar_lorene.f90~~AfferentGraph sourcefile~module_diffstar_lorene.f90 module_diffstar_lorene.f90 sourcefile~module_sphincs_id_full.f90 module_sphincs_id_full.f90 sourcefile~module_sphincs_id_full.f90->sourcefile~module_diffstar_lorene.f90 sourcefile~module_sphincs_id_lorene.f90 module_sphincs_id_lorene.f90 sourcefile~module_sphincs_id_lorene.f90->sourcefile~module_diffstar_lorene.f90 sourcefile~submodule_diffstar_lorene_access.f90 submodule_diffstar_lorene_access.f90 sourcefile~submodule_diffstar_lorene_access.f90->sourcefile~module_diffstar_lorene.f90 sourcefile~submodule_diffstar_lorene_constructor.f90 submodule_diffstar_lorene_constructor.f90 sourcefile~submodule_diffstar_lorene_constructor.f90->sourcefile~module_diffstar_lorene.f90 sourcefile~submodule_diffstar_lorene_io.f90 submodule_diffstar_lorene_io.f90 sourcefile~submodule_diffstar_lorene_io.f90->sourcefile~module_diffstar_lorene.f90 sourcefile~submodule_diffstar_lorene_memory.f90 submodule_diffstar_lorene_memory.f90 sourcefile~submodule_diffstar_lorene_memory.f90->sourcefile~module_diffstar_lorene.f90 sourcefile~submodule_diffstar_lorene_properties.f90 submodule_diffstar_lorene_properties.f90 sourcefile~submodule_diffstar_lorene_properties.f90->sourcefile~module_diffstar_lorene.f90 sourcefile~submodule_diffstar_lorene_read.f90 submodule_diffstar_lorene_read.f90 sourcefile~submodule_diffstar_lorene_read.f90->sourcefile~module_diffstar_lorene.f90 sourcefile~convergence_test.f90 convergence_test.f90 sourcefile~convergence_test.f90->sourcefile~module_sphincs_id_full.f90 sourcefile~convergence_test.f90->sourcefile~module_sphincs_id_lorene.f90 sourcefile~sphincs_id.f90 sphincs_id.f90 sourcefile~sphincs_id.f90->sourcefile~module_sphincs_id_full.f90 sourcefile~sphincs_id.f90->sourcefile~module_sphincs_id_lorene.f90

Contents


Source Code

! File:         module_diffstar_lorene.f90
! Authors:      Francesco Torsello (FT)
!************************************************************************
! Copyright (C) 2020-2023 Francesco Torsello                            *
!                                                                       *
! This file is part of SPHINCS_ID                                       *
!                                                                       *
! SPHINCS_ID is free software: you can redistribute it and/or modify    *
! it under the terms of the GNU General Public License as published by  *
! the Free Software Foundation, either version 3 of the License, or     *
! (at your option) any later version.                                   *
!                                                                       *
! SPHINCS_ID is distributed in the hope that it will be useful,         *
! but WITHOUT ANY WARRANTY; without even the implied warranty of        *
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the          *
! GNU General Public License for more details.                          *
!                                                                       *
! You should have received a copy of the GNU General Public License     *
! along with SPHINCS_ID. If not, see <https://www.gnu.org/licenses/>.   *
! The copy of the GNU General Public License should be in the file      *
! 'COPYING'.                                                            *
!************************************************************************

MODULE diffstar_lorene

  !***********************************************************
  !
  !#  This module contains the definition of TYPE diffstarlorene,
  !   and the SUBROUTINES that bind to the methods
  !   of |lorene|'s class |etrotdiff|, defined in
  !   Lorene/Export/C++/Source/Etoile
  !
  !   [|lorene| official repository](https://lorene.obspm.fr/index.html){:target="_blank"}
  !
  !***********************************************************


  USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT, C_DOUBLE, C_CHAR, C_PTR
  USE diffstar_base,               ONLY: diffstarbase
  USE id_base,                     ONLY: idbase
  USE utility,                     ONLY: itr, ios, err_msg, test_status, &
                                         perc, creturn, compute_g4, &
                                         determinant_sym4x4, show_progress
  USE timing,                      ONLY: timer


  IMPLICIT NONE


  !*******************************************************
  !                                                      *
  !            Definition of TYPE diffstarlorene         *
  !                                                      *
  !   This class imports and stores the |lorene| DRS ID  *
  !                                                      *
  !*******************************************************

  TYPE, EXTENDS(diffstarbase):: diffstarlorene
  !! TYPE representing a differentially rotating star (DRS)


    PRIVATE


    INTEGER:: diffstar_identifier= 0
    !! Identifier of the diffstarlorene object
    INTEGER:: eos_loreneid
    !! |lorene| identifier for the EoS

    !& C pointer to the |lorene|'s Etdiffrot object
    ! N.B. This variable is global. The pointer to the second |lorene| Etdiffrot
    !      object will overwrite the first one, and so on.
    !    This variable stores the pointer to the last defined |lorene| Etdiffrot
    !      object. That's why it is not freed in the destructor of a bns object.
    !      Presently, it has to be freed by the user at the end of the PROGRAM.
    !      See the last part of the PROGRAM in setup_diffstar.f90, for example.
    TYPE(C_PTR):: diffstar_ptr


    CONTAINS


    !-------------------!
    !--  SUBROUTINES  --!
    !-------------------!

    PROCEDURE:: derived_type_constructor => construct_diffstarlorene

    PROCEDURE:: construct_drs
    !! Constructs the |lorene| Etdiffrot object

    PROCEDURE:: destruct_drs
    !! Destructs the |lorene| Etdiffrot object

    PROCEDURE:: allocate_diffstar_memory
    !! Allocates memory for the [[diffstarlorene]] member arrays

    PROCEDURE:: deallocate_diffstar_memory
    !! Deallocates memory for the [[diffstarlorene]] member arrays

    PROCEDURE:: read_diffstar_properties
    !! Imports the parameters of the DRS from |lorene|

    PROCEDURE, PUBLIC:: print_diffstar_properties
    !! Prints the parameters of the DRS to the standard output

    PROCEDURE:: read_id_int
    !! Stores the ID in the [[diffstarlorene]] member arrays

    PROCEDURE:: read_id_full      => read_id_full
    PROCEDURE:: read_id_spacetime => read_id_spacetime
    PROCEDURE:: read_id_particles => read_id_particles
    PROCEDURE:: read_id_hydro     => read_id_hydro
    PROCEDURE:: read_id_mass_b    => read_id_mass_b
    PROCEDURE:: read_id_k         => read_id_k

    PROCEDURE:: nothing
    !# Procedure that does nothing. It is used to instantiate a deferred
    !  idbase procedure which is not needed in TYPE [[diffstarlorene]].
    !  It also serves as a placeholder in case the idbase procedure
    !  will be needed in the future.

    PROCEDURE:: initialize_id => nothing

    !-----------------!
    !--  FUNCTIONS  --!
    !-----------------!

    PROCEDURE:: read_mass_density => read_drslorene_mass_density
    !! Returns the |lorene|'s mass density at the given point

    PROCEDURE:: read_pressure => read_drslorene_pressure
    !! Returns the |lorene|'s pressure at the desired point

    PROCEDURE:: read_spatial_metric
    !! Returns the |lorene|'s conformally flat spatial ADM metric

    PROCEDURE:: test_position => is_hydro_positive
    !# Returns `.TRUE.` if the energy density or the specific energy or the
    !  pressure are positive

    !
    !-- Overloaded FUNCTION to access the fields as arrays and as values
    !

    GENERIC, PUBLIC:: get_field => get_fa, get_fv
    !# GENERIC PROCEDURE, overloded to access the [[diffstarlorene]]-member
    !  variables as arrays and as values
    PROCEDURE::       get_fa    => get_field_array
    !! Access the [[diffstarlorene]]-member arrays
    PROCEDURE::       get_fv    => get_field_value
    !! Access the components of the [[diffstarlorene]]-member arrays

    !
    !-- FUNCTIONS that access member variables
    !

    PROCEDURE:: get_eos_id => get_eos_loreneid
    !! Returns the |lorene| identifier for the EOS

    PROCEDURE:: return_eos_parameters => get_eos_parameters

    PROCEDURE, PUBLIC:: get_eos_loreneid
    !! Returns [[diffstarlorene:eos_loreneid]]

    PROCEDURE, PUBLIC:: get_diffstar_identifier
    !! Returns [[diffstarlorene:diffstar_identifier]]]

    !PROCEDURE, PUBLIC:: get_diffstar_ptr

    !PROCEDURE:: derived_type_destructor => destruct_diffstarlorene

    FINAL:: destruct_diffstarlorene
    !! Finalizer (Destructor) of a [[diffstarlorene]] object

    PROCEDURE, NOPASS:: finalize
    !# Corrects the |sph| |id| so that the linear \(\mathrm{ADM}\) momentum
    !  is zero

  END TYPE diffstarlorene

  !
  !-- Interface of the TYPE diffstarlorene
  !-- (i.e., declaration of the constructor)
  !
  !INTERFACE diffstarlorene
  !!! Interface of TYPE [[diffstarlorene]]
  !
  !  MODULE PROCEDURE:: construct_diffstarlorene
  !  !! Constructs a [[diffstarlorene]] object
  !
  !END INTERFACE diffstarlorene

  !
  !-- Interfaces of the constructor and destructor of the TYPE diffstarlorene
  !
  INTERFACE

   ! MODULE FUNCTION construct_diffstarlorene( &!derived_type,
   ! filename ) RESULT( foo )
   ! !! Constructs a [[diffstarlorene]] object
   !
   !   CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: filename
   !   !! |lorene| binary file containing the spectral DRS ID
   !   !CLASS(diffstarlorene):: derived_type
   !   CLASS(idbase), ALLOCATABLE:: foo
   !   !! Constructed [[diffstarlorene]] object
   !
   ! END FUNCTION construct_diffstarlorene

    MODULE SUBROUTINE destruct_diffstarlorene( this )
    !! Destruct a [[diffstarlorene]] object

      TYPE(diffstarlorene), INTENT(INOUT):: this
      !! [[diffstarlorene]] object to be destructed

    END SUBROUTINE destruct_diffstarlorene

  END INTERFACE

  !
  !-- Interfaces of the methods of the TYPE diffstarlorene
  !-- Their implementations are in submodule_diffstarlorene_methods.f90
  !
  INTERFACE


    !
    !-- SUBROUTINES
    !

    MODULE SUBROUTINE construct_diffstarlorene &
      ( derived_type, filename, eos_filenames )
    !! Constructs a [[diffstarlorene]] object
    !# Prints a summary of the physical properties the system
    !  to the standard output and, optionally, to a formatted file whose name
    !  is given as the optional argument `filename`

      CLASS(diffstarlorene), INTENT(OUT):: derived_type
      !! Constructed [[diffstarlorene]] object
      CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: filename
      !! |lorene| binary file containing the spectral |drs| |id|
      CHARACTER(LEN=*), DIMENSION(:), INTENT(IN), OPTIONAL :: eos_filenames
      !# Array of strings containing the names of the files containing the |eos|
      !  to be used for each matter object. If not PRESENT, information from
      !  the file `filename` is used

    END SUBROUTINE construct_diffstarlorene


    MODULE SUBROUTINE construct_drs( this, id_file, eos_filename )
    !! Interface of the subroutine that constructs the |lorene| Etdiffrot object

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene),          INTENT(INOUT)       :: this
      !> |lorene| binary file containing the spectral |drs| |id|
      CHARACTER(KIND=C_CHAR, LEN=*), INTENT(IN), OPTIONAL:: id_file
      CHARACTER(KIND=C_CHAR, LEN=*), INTENT(IN), OPTIONAL:: eos_filename
      !# Array of strings containing the names of the files containing the |eos|
      !  to be used for each matter object. If not PRESENT, information from
      !  the file `filename` is used

    END SUBROUTINE construct_drs


    MODULE SUBROUTINE destruct_drs( this )
    !! Destructs a |lorene| Etdiffrot object

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene), INTENT(INOUT):: this

    END SUBROUTINE destruct_drs


    MODULE SUBROUTINE allocate_diffstar_memory( this, d )
    !! Allocates allocatable arrays member of a [[diffstarlorene]] object

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene), INTENT(INOUT):: this
      !> Dimension of the arrays
      INTEGER,               INTENT(IN)    :: d

    END SUBROUTINE allocate_diffstar_memory


    MODULE SUBROUTINE deallocate_diffstar_memory( this )
    !! Deallocates allocatable arrays member of a [[diffstarlorene]] object

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene), INTENT(INOUT):: this

    END SUBROUTINE deallocate_diffstar_memory


    MODULE SUBROUTINE read_diffstar_properties( this )
    !! Imports the DRS parameters from |lorene|

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene), INTENT(INOUT):: this

    END SUBROUTINE read_diffstar_properties


    MODULE SUBROUTINE print_diffstar_properties( this )
    !! Prints the DRS parameters to the standard output

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene), INTENT(INOUT):: this

    END SUBROUTINE print_diffstar_properties


    MODULE SUBROUTINE read_id_int( this, n, x, y, z )
    !! Stores the ID in the [[diffstarlorene]] member arrays

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene),          INTENT(INOUT):: this
      INTEGER, INTENT(IN):: n
      DOUBLE PRECISION, DIMENSION(:), INTENT(IN)    :: x
      DOUBLE PRECISION, DIMENSION(:), INTENT(IN)    :: y
      DOUBLE PRECISION, DIMENSION(:), INTENT(IN)    :: z

    END SUBROUTINE read_id_int


    MODULE SUBROUTINE read_id_full( this, n, x, y, z,&
                                      lapse, &
                                      shift_x, shift_y, shift_z, &
                                      g_xx, g_xy, g_xz, &
                                      g_yy, g_yz, g_zz, &
                                      k_xx, k_xy, k_xz, &
                                      k_yy, k_yz, k_zz, &
                                      baryon_density, &
                                      energy_density, &
                                      specific_energy, &
                                      pressure, &
                                      u_euler_x, u_euler_y, u_euler_z )
    !# Stores the ID in non [[diffstarlorene]]-member arrays with the same
    !  shape as the [[diffstarlorene]] member arrays

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene),          INTENT(INOUT):: this
      INTEGER,                        INTENT(IN)    :: n
      DOUBLE PRECISION, DIMENSION(:), INTENT(IN)    :: x
      DOUBLE PRECISION, DIMENSION(:), INTENT(IN)    :: y
      DOUBLE PRECISION, DIMENSION(:), INTENT(IN)    :: z
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: lapse
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: shift_x
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: shift_y
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: shift_z
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: g_xx
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: g_xy
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: g_xz
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: g_yy
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: g_yz
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: g_zz
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: k_xx
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: k_xy
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: k_xz
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: k_yy
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: k_yz
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: k_zz
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: baryon_density
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: energy_density
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: specific_energy
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: pressure
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: u_euler_x
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: u_euler_y
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: u_euler_z

    END SUBROUTINE read_id_full


    MODULE SUBROUTINE read_id_spacetime( this, nx, ny, nz, &
                                              pos, &
                                              lapse, &
                                              shift, &
                                              g, &
                                              ek )
    !# Stores the spacetime ID in multi-dimensional arrays needed to compute
    !  the BSSN variables and constraints

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene),                INTENT(INOUT):: this
      INTEGER,                              INTENT(IN)    :: nx
      INTEGER,                              INTENT(IN)    :: ny
      INTEGER,                              INTENT(IN)    :: nz
      DOUBLE PRECISION, DIMENSION(:,:,:,:), INTENT(IN)    :: pos
      DOUBLE PRECISION, DIMENSION(:,:,:),   INTENT(INOUT):: lapse
      DOUBLE PRECISION, DIMENSION(:,:,:,:), INTENT(INOUT):: shift
      DOUBLE PRECISION, DIMENSION(:,:,:,:), INTENT(INOUT):: g
      DOUBLE PRECISION, DIMENSION(:,:,:,:), INTENT(INOUT):: ek

    END SUBROUTINE read_id_spacetime


    MODULE SUBROUTINE read_id_hydro( this, nx, ny, nz, &
                                             pos, &
                                             baryon_density, &
                                             energy_density, &
                                             specific_energy, &
                                             pressure, &
                                             u_euler )
    !# Stores the hydro ID in the arrays needed to compute the constraints
    !  on the refined mesh

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene),                INTENT(INOUT):: this
      INTEGER,                              INTENT(IN)    :: nx
      INTEGER,                              INTENT(IN)    :: ny
      INTEGER,                              INTENT(IN)    :: nz
      DOUBLE PRECISION, DIMENSION(:,:,:,:), INTENT(IN)    :: pos
      DOUBLE PRECISION, DIMENSION(:,:,:),   INTENT(INOUT):: baryon_density
      DOUBLE PRECISION, DIMENSION(:,:,:),   INTENT(INOUT):: energy_density
      DOUBLE PRECISION, DIMENSION(:,:,:),   INTENT(INOUT):: specific_energy
      DOUBLE PRECISION, DIMENSION(:,:,:),   INTENT(INOUT):: pressure
      DOUBLE PRECISION, DIMENSION(:,:,:,:), INTENT(INOUT):: u_euler

    END SUBROUTINE read_id_hydro


    MODULE SUBROUTINE read_id_particles( this, n, x, y, z, &
                                           lapse, &
                                           shift_x, shift_y, shift_z, &
                                           g_xx, g_xy, g_xz, &
                                           g_yy, g_yz, g_zz, &
                                           baryon_density, &
                                           energy_density, &
                                           specific_energy, &
                                           pressure, &
                                           u_euler_x, u_euler_y, u_euler_z )
    !! Stores the hydro ID in the arrays needed to compute the SPH ID

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene),          INTENT(INOUT):: this
      INTEGER,                        INTENT(IN)    :: n
      REAL(C_DOUBLE),   DIMENSION(:), INTENT(IN)    :: x
      REAL(C_DOUBLE),   DIMENSION(:), INTENT(IN)    :: y
      REAL(C_DOUBLE),   DIMENSION(:), INTENT(IN)    :: z
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: lapse
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: shift_x
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: shift_y
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: shift_z
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: g_xx
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: g_xy
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: g_xz
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: g_yy
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: g_yz
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: g_zz
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: baryon_density
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: energy_density
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: specific_energy
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: pressure
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: u_euler_x
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: u_euler_y
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: u_euler_z

    END SUBROUTINE read_id_particles


    MODULE SUBROUTINE read_id_mass_b( this, x, y, z, &
                                        g, &
                                        baryon_density, &
                                        gamma_euler )
    !! Stores the hydro ID in the arrays needed to compute the baryon mass

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene),          INTENT(INOUT):: this
      DOUBLE PRECISION,               INTENT(IN)    :: x
      DOUBLE PRECISION,               INTENT(IN)    :: y
      DOUBLE PRECISION,               INTENT( IN)     :: z
      DOUBLE PRECISION, DIMENSION(6), INTENT(OUT)   :: g
      DOUBLE PRECISION,               INTENT(OUT)   :: baryon_density
      DOUBLE PRECISION,               INTENT(OUT)   :: gamma_euler

    END SUBROUTINE read_id_mass_b


    MODULE SUBROUTINE read_id_k( this, n, x, y, z,&
                                         k_xx, k_xy, k_xz, &
                                         k_yy, k_yz, k_zz )
   !! Stores the components of the extrinsic curvature in arrays

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene),          INTENT(INOUT):: this
      INTEGER,                        INTENT(IN)    :: n
      DOUBLE PRECISION, DIMENSION(:), INTENT(IN)    :: x
      DOUBLE PRECISION, DIMENSION(:), INTENT(IN)    :: y
      DOUBLE PRECISION, DIMENSION(:), INTENT(IN)    :: z
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: k_xx
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: k_xy
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: k_xz
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: k_yy
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: k_yz
      DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT):: k_zz

    END SUBROUTINE read_id_k


    !
    !-- FUNCTIONS
    !
    MODULE FUNCTION read_drslorene_mass_density( this, x, y, z ) RESULT( res )
    !! Returns the |lorene| baryon mass density at a point \((x,y,z)\)

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene), INTENT(IN):: this
      !> \(x\) coordinate of the desired point
      DOUBLE PRECISION, INTENT(IN), VALUE:: x
      !> \(y\) coordinate of the desired point
      DOUBLE PRECISION, INTENT(IN), VALUE:: y
      !> \(z\) coordinate of the desired point
      DOUBLE PRECISION, INTENT(IN), VALUE:: z
      !> Baryon mass density at \((x,y,z)\)
      DOUBLE PRECISION:: res

    END FUNCTION read_drslorene_mass_density


    MODULE FUNCTION read_drslorene_pressure( this, x, y, z ) RESULT( res )
    !! Returns the |lorene| pressure at a point \((x,y,z)\)

      !> [[bnslorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene), INTENT(IN)       :: this
      !> \(x\) coordinate of the desired point
      DOUBLE PRECISION, INTENT(IN), VALUE:: x
      !> \(y\) coordinate of the desired point
      DOUBLE PRECISION, INTENT(IN), VALUE:: y
      !> \(z\) coordinate of the desired point
      DOUBLE PRECISION, INTENT(IN), VALUE:: z
      !> Pressure at \((x,y,z)\)
      DOUBLE PRECISION:: res

    END FUNCTION read_drslorene_pressure


    MODULE FUNCTION read_spatial_metric( this, x, y, z ) RESULT( res )
    !# Returns the |lorene| conformally flat spatial metric component
    !  \(g_{xx}=g_{yy}=g_{zz}\) at a point \((x,y,z)\)

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene),     INTENT(IN)       :: this
      !> \(x\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE:: x
      !> \(y\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE:: y
      !> \(z\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE:: z
      !> \(g_{xx}=g_{yy}=g_{zz}\) at \((x,y,z)\)
      REAL(C_DOUBLE):: res

    END FUNCTION read_spatial_metric


    MODULE FUNCTION is_hydro_positive( this, x, y, z ) RESULT( res )
    !# Returns .TRUE. if the energy density or the specific energy or the
    !  pressure are positive, .FALSE. otherwise

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene),     INTENT(IN)       :: this
      !> \(x\) coordinate of the desired point
      DOUBLE PRECISION, INTENT(IN), VALUE:: x
      !> \(y\) coordinate of the desired point
      DOUBLE PRECISION, INTENT(IN), VALUE:: y
      !> \(z\) coordinate of the desired point
      DOUBLE PRECISION, INTENT(IN), VALUE:: z
      !& 1 if the energy density or the specific energy or the pressure
      !  are negative, 0 otherwise
      LOGICAL:: res

    END FUNCTION is_hydro_positive


    MODULE FUNCTION get_field_array( this, field ) RESULT( field_array )
    !! Returns the [[diffstarlorene]] member arrays named field

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene),          INTENT(IN)             :: this
      !> Name of the desired [[diffstarlorene]] member array
      CHARACTER(LEN=:), INTENT(IN), ALLOCATABLE:: field
      !> Desired [[diffstarlorene]] member array
      DOUBLE PRECISION, DIMENSION(:),    ALLOCATABLE:: field_array

    END FUNCTION get_field_array


    MODULE FUNCTION get_field_value( this, field, n ) RESULT( field_value )
    !! Returns the component n of the [[diffstarlorene]] member arrays named field

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene),          INTENT(IN)             :: this
      !> Name of the desired [[diffstarlorene]] member array
      CHARACTER(LEN=:), INTENT(IN), ALLOCATABLE:: field
      !> Component of the desired [[diffstarlorene]] member array
      INTEGER,             INTENT(IN)             :: n
      !> Component n of the desired [[diffstarlorene]] member array
      DOUBLE PRECISION                              :: field_value

    END FUNCTION get_field_value


    MODULE FUNCTION get_diffstar_identifier( this )

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene), INTENT(IN):: this
      ! Result
      DOUBLE PRECISION:: get_diffstar_identifier

    END FUNCTION get_diffstar_identifier


    MODULE FUNCTION get_eos_loreneid( this )

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene), INTENT(IN):: this
      ! Result
      INTEGER:: get_eos_loreneid

    END FUNCTION get_eos_loreneid


    MODULE SUBROUTINE get_eos_parameters( this, i_matter, eos_params )

      !> [[diffstarlorene]] object which this PROCEDURE is a member of
      CLASS(diffstarlorene), INTENT(IN):: this
      INTEGER, INTENT(IN):: i_matter
      !! Index of the matter object whose parameter is to return
      DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE, INTENT(OUT):: eos_params
      !# Array containing the parameters of the |eos| for the DRS

    END SUBROUTINE get_eos_parameters


    MODULE SUBROUTINE finalize &
      ( npart, pos, nlrf, u, pr, vel_u, theta, nstar, nu )
    !# Post-process the |sph| |id|; for example, correct for the residual
    !  ADM linear momentum.

      !IMPORT:: idbase
      !CLASS(idbase),                        INTENT(IN)   :: this
      INTEGER,                              INTENT(IN)   :: npart
      !! Particle number
      DOUBLE PRECISION, DIMENSION(3,npart), INTENT(INOUT):: pos
      !! Particle positions
      DOUBLE PRECISION, DIMENSION(npart),   INTENT(INOUT):: nlrf
      !! Baryon density in the local rest frame on the particles
      DOUBLE PRECISION, DIMENSION(npart),   INTENT(INOUT):: u
      !! Specific internal energy on the particles
      DOUBLE PRECISION, DIMENSION(npart),   INTENT(INOUT):: pr
      !! Pressure on the particles
      DOUBLE PRECISION, DIMENSION(3,npart), INTENT(INOUT):: vel_u
      !! Spatial velocity in the computing frame on the particles
      DOUBLE PRECISION, DIMENSION(npart),   INTENT(INOUT):: theta
      !! Generalized Lorentz factor on the particles
      DOUBLE PRECISION, DIMENSION(npart),   INTENT(INOUT):: nstar
      !! Proper baryon density in the local rest frame on the particles
      DOUBLE PRECISION, DIMENSION(npart),   INTENT(INOUT):: nu
      !! Baryon number per particle

    END SUBROUTINE finalize


    MODULE SUBROUTINE nothing( this, flag, switch )
    !# Procedure that does nothing. It is used to instantiate a deferred
    !  idbase procedure which is not needed in TYPE [[diffstarlorene]].
    !  It also serves as a placeholder in case the idbase procedure
    !  will be needed in the future.

      CLASS(diffstarlorene), INTENT(INOUT)       :: this
      INTEGER,               INTENT(IN)          :: flag
      !! Identifies what kind of initialization has to be done
      LOGICAL,               INTENT(IN), OPTIONAL:: switch
      !! If `.TRUE.`, switch to a different initialization

    END SUBROUTINE nothing


    !MODULE FUNCTION get_diffstar_ptr( this )
    !
    !  ! Argument
    !  CLASS(diffstarlorene), INTENT(IN):: this
    !  ! Result
    !  TYPE(C_PTR):: get_diffstar_ptr
    !
    !END FUNCTION get_diffstar_ptr


  END INTERFACE


  PRIVATE:: construct_etdiffrot, get_diffstar_full, get_diffstar_spacetime, &
            get_diffstar_particles, get_diffstar_mass_b, &
            get_diffstar_hydro, get_diffstar_mass_density, &
            get_diffstar_pressure, &
            get_diffstar_spatial_metric, positive_hydro, get_diffstar_params, &
            destruct_etdiffrot


  !-----------------------------------------------------------------!
  !--  Interfaces to the methods of |lorene|'s class |etdiffrot|  --!
  !-----------------------------------------------------------------!


  INTERFACE


    FUNCTION construct_etdiffrot( c_id_file, c_eos_file ) RESULT( optr ) &
      BIND(C, NAME= "construct_et_diffrot")

      !***********************************************
      !
      !# Interface to the |lorene| method of class
      !  |etdiffrot| with the same name, that constructs
      !  the |lorene| |etdiffrot| object
      !
      !  FT 24.10.2021
      !
      !***********************************************

      IMPORT :: C_PTR, C_CHAR

      IMPLICIT NONE

      !& C string of the name of the |lorene| binary file storing the spectral
      !  DRS ID
      CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN), OPTIONAL :: &
                                                              c_id_file

      CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN), OPTIONAL :: &
                                                              c_eos_file
      !> C pointer pointing to the constructed |lorene| |etdiffrot| object

      TYPE(C_PTR) :: optr

    END FUNCTION construct_etdiffrot


    SUBROUTINE get_diffstar_full( optr, &
                                  x, y, z, &
                                  lapse, &
                                  shift_x, shift_y, shift_z, &
                                  g_rr, g_tt, g_pp, &
                                  k_xx, k_xy, k_xz, &
                                  k_yy, k_yz, k_zz, &
                                  baryon_density, &
                                  energy_density, &
                                  specific_energy, &
                                  pressure, &
                                  v_euler_x, v_euler_y, v_euler_z ) &
      BIND(C, NAME= "get_rotdiff_id")

      !*************************************************
      !
      !# Interface to the |lorene| method of class
      !  |etdiffrot| with the same name, that reads the full
      !  |lorene| ID at the specified point.
      !  That is, imports the metric fields, the
      !  components of the extrinsic curvature [c/km],
      !  and the hydro fields.
      !
      !  - shift vector [c]
      !  - baryon mass density [kg m^{-3}]
      !  - energy density [kg c^2 m^{-3}]
      !  - pressure [kg c^2 m^{-3}]
      !  - specific internal energy [c^2]
      !  - fluid 3-velocity with respect to the
      !    Eulerian observer [c]
      !
      !  FT 24.10.2021
      !
      !*************************************************

      IMPORT :: C_DOUBLE, C_PTR

      IMPLICIT NONE

      !> C pointer pointing to a |lorene| |etdiffrot| object
      TYPE(C_PTR),    INTENT(IN), VALUE :: optr
      !> \(x\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE :: x
      !> \(y\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE :: y
      !> \(z\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE :: z
      REAL(C_DOUBLE), INTENT(OUT)       :: lapse
      REAL(C_DOUBLE), INTENT(OUT)       :: shift_x
      REAL(C_DOUBLE), INTENT(OUT)       :: shift_y
      REAL(C_DOUBLE), INTENT(OUT)       :: shift_z
      REAL(C_DOUBLE), INTENT(OUT)       :: g_rr, g_tt, g_pp
      REAL(C_DOUBLE), INTENT(OUT)       :: k_xx
      REAL(C_DOUBLE), INTENT(OUT)       :: k_xy
      REAL(C_DOUBLE), INTENT(OUT)       :: k_xz
      REAL(C_DOUBLE), INTENT(OUT)       :: k_yy
      REAL(C_DOUBLE), INTENT(OUT)       :: k_yz
      REAL(C_DOUBLE), INTENT(OUT)       :: k_zz
      REAL(C_DOUBLE), INTENT(OUT)       :: baryon_density
      REAL(C_DOUBLE), INTENT(OUT)       :: energy_density
      REAL(C_DOUBLE), INTENT(OUT)       :: specific_energy
      REAL(C_DOUBLE), INTENT(OUT)       :: pressure
      REAL(C_DOUBLE), INTENT(OUT)       :: v_euler_x
      REAL(C_DOUBLE), INTENT(OUT)       :: v_euler_y
      REAL(C_DOUBLE), INTENT(OUT)       :: v_euler_z

    END SUBROUTINE get_diffstar_full


    SUBROUTINE get_diffstar_spacetime( optr, &
                                       x, y, z, &
                                       lapse, &
                                       shift_x, shift_y, shift_z, &
                                       g_rr, g_tt, g_pp, &
                                       k_xx, k_xy, k_xz, &
                                       k_yy, k_yz, k_zz ) &
      BIND(C, NAME= "get_rotdiff_spacetime")

      !*************************************************
      !
      !# Interface to the |lorene| method of class
      !  |etdiffrot| with the same name, that reads the
      !  metric fields and the components
      !  of the extrinsic curvature [c/km] from |lorene|,
      !  at the specified point
      !
      !  FT 24.10.2021
      !
      !*************************************************

      IMPORT :: C_DOUBLE, C_PTR

      IMPLICIT NONE

      !> C pointer pointing to a |lorene| |etdiffrot| object
      TYPE(C_PTR),    INTENT(IN), VALUE :: optr
      !> \(x\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE :: x
      !> \(y\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE :: y
      !> \(z\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE :: z
      REAL(C_DOUBLE), INTENT(OUT)       :: lapse
      REAL(C_DOUBLE), INTENT(OUT)       :: shift_x
      REAL(C_DOUBLE), INTENT(OUT)       :: shift_y
      REAL(C_DOUBLE), INTENT(OUT)       :: shift_z
      REAL(C_DOUBLE), INTENT(OUT)       :: g_rr, g_tt, g_pp
      REAL(C_DOUBLE), INTENT(OUT)       :: k_xx
      REAL(C_DOUBLE), INTENT(OUT)       :: k_xy
      REAL(C_DOUBLE), INTENT(OUT)       :: k_xz
      REAL(C_DOUBLE), INTENT(OUT)       :: k_yy
      REAL(C_DOUBLE), INTENT(OUT)       :: k_yz
      REAL(C_DOUBLE), INTENT(OUT)       :: k_zz

    END SUBROUTINE get_diffstar_spacetime


    SUBROUTINE get_diffstar_particles( optr, &
                                       x, y, z, &
                                       lapse, &
                                       shift_x, shift_y, shift_z, &
                                       g_rr, g_tt, g_pp, &
                                       baryon_density, &
                                       energy_density, &
                                       specific_energy, &
                                       pressure, &
                                       v_euler_x, v_euler_y, v_euler_z ) &
      BIND(C, NAME= "get_rotdiff_particles")

      !**********************************************
      !
      !# Interface to the |lorene| method of class
      !  |etdiffrot| with the same name, that reads the
      !  hydro fields and the metric fields *
      !  from |lorene|, at the specified point
      !
      !  - shift vector [c]
      !  - baryon mass density [kg m^{-3}]
      !  - energy density [kg c^2 m^{-3}]
      !  - pressure [kg c^2 m^{-3}]
      !  - specific internal energy [c^2]
      !  - fluid 3-velocity with respect to the
      !    Eulerian observer [c]
      !
      !  FT 24.10.2021
      !
      !**********************************************

      IMPORT :: C_DOUBLE, C_PTR

      IMPLICIT NONE

      !> C pointer pointing to a |lorene| |etdiffrot| object
      TYPE(C_PTR),    INTENT(IN), VALUE :: optr
      !> \(x\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE :: x
      !> \(y\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE :: y
      !> \(z\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE :: z
      REAL(C_DOUBLE), INTENT(OUT)       :: lapse
      REAL(C_DOUBLE), INTENT(OUT)       :: shift_x
      REAL(C_DOUBLE), INTENT(OUT)       :: shift_y
      REAL(C_DOUBLE), INTENT(OUT)       :: shift_z
      REAL(C_DOUBLE), INTENT(OUT)       :: g_rr, g_tt, g_pp
      REAL(C_DOUBLE), INTENT(OUT)       :: baryon_density
      REAL(C_DOUBLE), INTENT(OUT)       :: energy_density
      REAL(C_DOUBLE), INTENT(OUT)       :: specific_energy
      REAL(C_DOUBLE), INTENT(OUT)       :: pressure
      REAL(C_DOUBLE), INTENT(OUT)       :: v_euler_x
      REAL(C_DOUBLE), INTENT(OUT)       :: v_euler_y
      REAL(C_DOUBLE), INTENT(OUT)       :: v_euler_z

    END SUBROUTINE get_diffstar_particles


    SUBROUTINE get_diffstar_mass_b( optr, &
                                    x, y, z, &
                                    g_rr, g_tt, g_pp, &
                                    baryon_density, &
                                    gamma_euler ) &
      BIND(C, NAME= "get_rotdiff_mass_b")

      !************************************************
      !
      !# Interface to the |lorene| method of class
      !  |etdiffrot| with the same name, that reads the
      !  hydro fields and the metric fields
      !  from |lorene|, at the specified point,
      !  needed to compute the baryon mass.
      !
      !  - shift vector [c]
      !  - baryon mass density [kg m^{-3}]
      !  - fluid 3-velocity with respect to the
      !    Eulerian observer [c]
      !
      !  FT 24.10.2021
      !
      !************************************************

      IMPORT :: C_DOUBLE, C_PTR

      IMPLICIT NONE

      !> C pointer pointing to a |lorene| |etdiffrot| object
      TYPE(C_PTR),    INTENT(IN), VALUE :: optr
      !> \(x\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE :: x
      !> \(y\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE :: y
      !> \(z\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE :: z
      !> \(g_{xx}=g_{yy}=g_{zz}\) at \(x,y,z\)
      REAL(C_DOUBLE), INTENT(OUT)       :: g_rr, g_tt, g_pp
      !> Baryon mass density at \(x,y,z\)
      REAL(C_DOUBLE), INTENT(OUT)       :: baryon_density
      !& Relative Lorentz factor between the 4-velocity of the fluid
      !  wrt the Eulerian observer and the 4-velocity of the Eulerian observer
      !  at \(x,y,z\)
      REAL(C_DOUBLE), INTENT(OUT)       :: gamma_euler

    END SUBROUTINE get_diffstar_mass_b


    SUBROUTINE get_diffstar_hydro( optr, &
                                   x, y, z, &
                                   baryon_density, &
                                   energy_density, &
                                   specific_energy, &
                                   pressure, &
                                   v_euler_x, v_euler_y, v_euler_z ) &
      BIND(C, NAME= "get_rotdiff_hydro")

      !***********************************************
      !
      !# Interface to the |lorene| method of class
      !  |etdiffrot| with the same name, that reads the
      !  hydro fields from |lorene|, at the
      !  specified point
      !
      !  - baryon mass density [kg m^{-3}]
      !  - energy density [kg c^2 m^{-3}]
      !  - pressure [kg c^2 m^{-3}]
      !  - specific internal energy [c^2]
      !  - fluid 3-velocity with respect to the
      !    Eulerian observer [c]
      !
      !  FT 24.10.2021
      !
      !***********************************************

      IMPORT :: C_DOUBLE, C_PTR

      IMPLICIT NONE

      !> C pointer pointing to a |lorene| |etdiffrot| object
      TYPE(C_PTR),    INTENT(IN), VALUE :: optr
      !> \(x\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE :: x
      !> \(y\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE :: y
      !> \(z\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN), VALUE :: z
      REAL(C_DOUBLE), INTENT(OUT)       :: baryon_density
      REAL(C_DOUBLE), INTENT(OUT)       :: energy_density
      REAL(C_DOUBLE), INTENT(OUT)       :: specific_energy
      REAL(C_DOUBLE), INTENT(OUT)       :: pressure
      REAL(C_DOUBLE), INTENT(OUT)       :: v_euler_x
      REAL(C_DOUBLE), INTENT(OUT)       :: v_euler_y
      REAL(C_DOUBLE), INTENT(OUT)       :: v_euler_z

    END SUBROUTINE get_diffstar_hydro


    FUNCTION get_diffstar_mass_density( optr, x, y, z ) RESULT( res ) &
      BIND(C, NAME= "get_rotdiff_mass_density")

      !********************************************
      !
      !# Interface to the |lorene| method of class
      !  |etdiffrot| with the same name, that returns
      !  the baryon mass density \([\mathrm{kg}\,
      !  \mathrm{m}^{-3}]\) from |lorene|,
      !  at the specified point
      !
      !  FT 24.10.2021
      !
      !********************************************

      IMPORT :: C_DOUBLE, C_PTR

      IMPLICIT NONE

      !> C pointer pointing to a |lorene| |etdiffrot| object
      TYPE(C_PTR),    INTENT(IN),  VALUE :: optr
      !> \(x\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN),  VALUE :: x
      !> \(y\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN),  VALUE :: y
      !> \(z\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN),  VALUE :: z
      !& Baryon mass density \([\mathrm{kg}\, \mathrm{m}^{-3}]\) at the desired
      !  point \((x,y,z)\)
      REAL(C_DOUBLE) :: res

    END FUNCTION get_diffstar_mass_density


    FUNCTION get_diffstar_pressure( optr, x, y, z ) RESULT( res ) &
      BIND(C, NAME= "get_rotdiff_pressure")

      !********************************************
      !
      !# Interface to the |lorene| method of class
      !  |etdiffrot| with the same name, that returns
      !  the baryon mass density \([\mathrm{kg}\,
      !  c^2 \mathrm{m}^{-3}]\) from |lorene|,
      !  at the specified point
      !
      !  FT 06.12.2022
      !
      !********************************************

      IMPORT :: C_DOUBLE, C_PTR

      IMPLICIT NONE

      !> C pointer pointing to a |lorene| |etdiffrot| object
      TYPE(C_PTR),    INTENT(IN),  VALUE :: optr
      !> \(x\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN),  VALUE :: x
      !> \(y\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN),  VALUE :: y
      !> \(z\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN),  VALUE :: z
      !& Pressure \([\mathrm{kg}\,c^2\, \mathrm{m}^{-3}]\) at the desired
      !  point \((x,y,z)\)
      REAL(C_DOUBLE) :: res

    END FUNCTION get_diffstar_pressure


    FUNCTION get_diffstar_spatial_metric( optr, x, y, z ) RESULT( res ) &
      BIND(C, NAME= "get_g_rr")

      !************************************************
      !
      !# Interface to the |lorene| method of class
      !  |etdiffrot| with the same name, that returns the
      !  diagonal components of the metric,
      !  all equal to the |lorene| conformal factor to
      !  the 4th power.
      !
      !  FT 24.10.2021
      !
      !************************************************

      IMPORT :: C_DOUBLE, C_PTR

      IMPLICIT NONE

      !> C pointer pointing to a |lorene| |etdiffrot| object
      TYPE(C_PTR),    INTENT(IN),  VALUE :: optr
      !> \(x\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN),  VALUE :: x
      !> \(y\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN),  VALUE :: y
      !> \(z\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN),  VALUE :: z
      !& Spatial metric component
      !  \(g_{xx}=g_{yy}=g_{zz}\) at the point \((x,y,z)\)
      REAL(C_DOUBLE) :: res

    END FUNCTION get_diffstar_spatial_metric


    FUNCTION positive_hydro( optr, x, y, z ) RESULT( res ) &
      BIND(C, NAME= "is_hydro_positive_diffrot")

      !************************************************
      !
      !# Interface to the |lorene| method of class
      !  |etdiffrot| with the same name, that returns 1
      !  if the energy density is positive,
      !  and if the specific energy is positive,
      !  and if the pressure is nonpositive,
      !  at the specified point; it returns 0 otherwise
      !
      !  FT 24.10.2021
      !
      !************************************************

      IMPORT :: C_INT, C_DOUBLE, C_PTR

      IMPLICIT NONE

      !> C pointer pointing to a |lorene| |etdiffrot| object
      TYPE(C_PTR),    INTENT(IN),  VALUE :: optr
      !> \(x\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN),  VALUE :: x
      !> \(y\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN),  VALUE :: y
      !> \(z\) coordinate of the desired point
      REAL(C_DOUBLE), INTENT(IN),  VALUE :: z
      !& 1 if the energy density or the specific energy or the pressure
      !  are positive, 0 otherwise
      INTEGER(C_INT) :: res

    END FUNCTION positive_hydro


    SUBROUTINE get_diffstar_params( optr,                           &
                                    omega_c,                        &
                                    mass,                           &
                                    mass_grav,                      &
                                    angular_momentum,               &
                                    tsw,                            &
                                    grv2,                           &
                                    grv3,                           &
                                    r_circ,                         &
                                    surface_area,                   &
                                    r_mean,                         &
                                    r_eq,                           &
                                    r_eq_pi2,                       &
                                    r_eq_pi,                        &
                                    r_eq_3pi2,                      &
                                    r_eq_pole,                      &
                                    r_ratio,                        &
                                    r_isco,                         &
                                    f_isco,                         &
                                    specific_energy_isco,           &
                                    specific_angular_momentum_isco, &
                                    area_radius,                    &
                                    ent_center,                     &
                                    nbar_center,                    &
                                    rho_center,                     &
                                    energy_density_center,          &
                                    specific_energy_center,         &
                                    pressure_center,                &
                                    redshift_eqf,                   &
                                    redshift_eqb,                   &
                                    redshift_pole,                  &
                                    eos,                            &
                                    eos_id,                         &
                                    gamma,                          &
                                    kappa,                          &
                                    npeos,                          &
                                    gamma0,                         &
                                    gamma1,                         &
                                    gamma2,                         &
                                    gamma3,                         &
                                    kappa0,                         &
                                    kappa1,                         &
                                    kappa2,                         &
                                    kappa3,                         &
                                    logP1,                          &
                                    logRho0,                        &
                                    logRho1,                        &
                                    logRho2,                        &
                                    eos_table )                     &
      BIND(C, NAME= "get_rotdiff_params")

      !**********************************************
      !
      !# Interface to the |lorene| method of class
      !  |etdiffrot| with the same name, that stores
      !  the physical parameters of the binary
      !  system from |lorene| in the desired variables
      !
      !  FT 24.10.2021
      !
      !**********************************************

      IMPORT :: C_INT, C_DOUBLE, C_PTR, C_CHAR

      IMPLICIT NONE

      !> C pointer pointing to a |lorene| |etdiffrot| object
      TYPE(C_PTR),    INTENT(IN), VALUE :: optr
      REAL(C_DOUBLE), INTENT(OUT)       :: omega_c
      REAL(C_DOUBLE), INTENT(OUT)       :: mass
      REAL(C_DOUBLE), INTENT(OUT)       :: mass_grav
      REAL(C_DOUBLE), INTENT(OUT)       :: angular_momentum
      REAL(C_DOUBLE), INTENT(OUT)       :: tsw
      REAL(C_DOUBLE), INTENT(OUT)       :: grv2
      REAL(C_DOUBLE), INTENT(OUT)       :: grv3
      REAL(C_DOUBLE), INTENT(OUT)       :: r_circ
      REAL(C_DOUBLE), INTENT(OUT)       :: surface_area
      REAL(C_DOUBLE), INTENT(OUT)       :: r_mean
      REAL(C_DOUBLE), INTENT(OUT)       :: r_eq
      REAL(C_DOUBLE), INTENT(OUT)       :: r_eq_pi2
      REAL(C_DOUBLE), INTENT(OUT)       :: r_eq_pi
      REAL(C_DOUBLE), INTENT(OUT)       :: r_eq_3pi2
      REAL(C_DOUBLE), INTENT(OUT)       :: r_eq_pole
      REAL(C_DOUBLE), INTENT(OUT)       :: r_ratio
      REAL(C_DOUBLE), INTENT(OUT)       :: r_isco
      REAL(C_DOUBLE), INTENT(OUT)       :: f_isco
      REAL(C_DOUBLE), INTENT(OUT)       :: specific_energy_isco
      REAL(C_DOUBLE), INTENT(OUT)       :: specific_angular_momentum_isco
      REAL(C_DOUBLE), INTENT(OUT)       :: area_radius
      REAL(C_DOUBLE), INTENT(OUT)       :: ent_center
      REAL(C_DOUBLE), INTENT(OUT)       :: nbar_center
      REAL(C_DOUBLE), INTENT(OUT)       :: rho_center
      REAL(C_DOUBLE), INTENT(OUT)       :: energy_density_center
      REAL(C_DOUBLE), INTENT(OUT)       :: specific_energy_center
      REAL(C_DOUBLE), INTENT(OUT)       :: pressure_center
      REAL(C_DOUBLE), INTENT(OUT)       :: redshift_eqf
      REAL(C_DOUBLE), INTENT(OUT)       :: redshift_eqb
      REAL(C_DOUBLE), INTENT(OUT)       :: redshift_pole
      CHARACTER(KIND=C_CHAR), DIMENSION(100), INTENT(OUT):: eos
      INTEGER(C_INT)                    :: eos_id
      REAL(C_DOUBLE), INTENT(OUT)       :: gamma
      REAL(C_DOUBLE), INTENT(OUT)       :: kappa
      INTEGER(C_INT)                    :: npeos
      REAL(C_DOUBLE), INTENT(OUT)       :: gamma0
      REAL(C_DOUBLE), INTENT(OUT)       :: gamma1
      REAL(C_DOUBLE), INTENT(OUT)       :: gamma2
      REAL(C_DOUBLE), INTENT(OUT)       :: gamma3
      REAL(C_DOUBLE), INTENT(OUT)       :: kappa0
      REAL(C_DOUBLE), INTENT(OUT)       :: kappa1
      REAL(C_DOUBLE), INTENT(OUT)       :: kappa2
      REAL(C_DOUBLE), INTENT(OUT)       :: kappa3
      REAL(C_DOUBLE), INTENT(OUT)       :: logP1
      REAL(C_DOUBLE), INTENT(OUT)       :: logRho0
      REAL(C_DOUBLE), INTENT(OUT)       :: logRho1
      REAL(C_DOUBLE), INTENT(OUT)       :: logRho2
      CHARACTER(KIND=C_CHAR), DIMENSION(500), INTENT(OUT):: eos_table

    END SUBROUTINE get_diffstar_params


    SUBROUTINE destruct_etdiffrot( optr ) &
      BIND(C, NAME= "destruct_et_diffrot")

      !**********************************************
      !
      !# Interface to the |lorene| method of class
      !  |etdiffrot| with the same name, that destructs
      !  the |lorene| |etdiffrot| object
      !
      ! FT 24.10.2021
      !
      !**********************************************

      IMPORT :: C_PTR

      IMPLICIT NONE

      TYPE(C_PTR), INTENT(IN), VALUE :: optr
      !! C pointer pointing to the |lorene| |etdiffrot| object to destruct

    END SUBROUTINE destruct_etdiffrot


  END INTERFACE


END MODULE diffstar_lorene