Difference between revisions of "Calling UCVM With Fortran"

From SCECpedia
Jump to navigationJump to search
(Undo revision 16775 by Davidgil (talk))
 
(17 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Calling UCVM ==
+
== Calling UCVM With Fortran==
  
== Example Code ==
+
Calling UCVM using Fortran is a relatively trivial procedure. In order to do so, you must install [http://scec.usc.edu/scecpedia/UCVM_User_Guide UCVM] as per the guide, including the etree and Proj.4 libraries. It is also necessary to download and install any community velocity models that you will be calling. UCVM requires those velocity models to be added to a configuration file so that they can be referenced within the application.
  
 +
Once that initial set up is done, compiling and linking with gfortran is easy. You must include the UCVM library, the Proj.4 library, the e-tree library, as well as any velocity model libraries that you have compiled into UCVM. For CVM-H, please note that there are actually two libraries required: lvxapi and lgeo.
  
        program example
+
Because the default convention for calling C programs from Fortran automatically appends an underscore to the end of the function name, you must turn that off via a flag called "fno-underscoring". This will make the Fortran compiler try and find foo() instead of foo_().
        c      UCVM Configuration Location
 
                CHARACTER(LEN=32) ucvmconf
 
        c      Model Name
 
                CHARACTER(LEN=4) model
 
        c      Number of points we're passing to ucvm_query
 
                INTEGER pts     
 
  
c      The UCVM point data structure.  
+
As an example, suppose we have a Fortran file, example.f, that calls UCVM. We have compiled UCVM with CVM-S and CVM-H. The code to compile example.f would be as follows:
c      coord(1) is longitude
 
c      coord(2) is latitutde
 
c      coord(3) is depth
 
        TYPE :: ucvm_point_t
 
                REAL*8 coord(3)
 
        END TYPE ucvm_point_t
 
  
c      Generic property structure
+
gfortran example.f -o ./example -L./ucvm-13.9.0/inst/lib -L./cvms/lib -L./cvmh-11.9.1/inst/lib -L./proj-4.8.0/inst/lib -L./euclid3-1.3/libsrc -lucvm -lcvms -lvxapi -lgeo -lproj -letree -fno-underscoring
c      Source is where it comes from
 
c      vp is P-wave velocity in m/s
 
c      vs is S-wave velocity in m/s
 
c      rho is density in kg/m^3
 
        TYPE :: ucvm_prop_t
 
                INTEGER source
 
                REAL*8 vp
 
                REAL*8 vs
 
                REAL*8 rho
 
        END TYPE ucvm_prop_t
 
  
c      Returned data structure
+
The basic structure of how to call UCVM within Fortran is outlined in the example below.
        TYPE :: ucvm_data_t
 
                REAL*8 surf
 
                REAL*8 vs30
 
                REAL*8 depth
 
                INTEGER domain
 
                REAL*8 shift_cr
 
                REAL*8 shift_gtl
 
                type(ucvm_prop_t) crust
 
                type(ucvm_prop_t) gtl
 
                type(ucvm_prop_t) cmb
 
        END TYPE ucvm_data_t
 
  
c      For our example we'll query five points
+
== Example Code ==
        type(ucvm_point_t) point(5)
 
c      And we'll get back five sets of material properties
 
        type(ucvm_data_t) returnData(5)
 
  
c      Number of points is 5.
 
        pts = 5
 
  
c      We'll start at -118, 34 at 0 depth and go down by 1000m
+
                program example
c      each step
+
         
        do 10 i = 1, 5
+
        c      UCVM Configuration Location
                point(i)%coord(1) = -118
+
                CHARACTER(LEN=80) ucvmconf
                point(i)%coord(2) = 34
+
        c      Model Name
10              point(i)%coord(3) = (i - 1) * 1000
+
                CHARACTER(LEN=8) model
 
+
        c      Number of points we're passing to ucvm_query
c      Where is our configuration file?
+
                INTEGER pts     
        ucvmconf = "/home/scec-01/davidgil/ucvm.conf"
+
         
 
+
        c      The UCVM point data structure.
c      What model are we querying?
+
        c      coord(1) is longitude
        model = "cvms"
+
        c      coord(2) is latitutde
 
+
        c      coord(3) is depth
c      Initialize UCVM
+
                TYPE :: ucvm_point_t
        call ucvm_init(ucvmconf)
+
                      REAL*8 coord(3)
 
+
                END TYPE ucvm_point_t
c      Add the model to UCVM
+
         
        call ucvm_add_model(model)
+
        c      Generic property structure
 
+
        c      Source is where it comes from
c      Query the model. Note that the number of points is passed
+
        c      vp is P-wave velocity in m/s
c      by value, not reference.
+
        c      vs is S-wave velocity in m/s
        call ucvm_query(%VAL(pts), point, returnData)
+
        c      rho is density in kg/m^3
 
+
                TYPE :: ucvm_prop_t
        print *, model, " results for lon -118, lat 34"
+
                        INTEGER source
 
+
                        REAL*8 vp
c      Print out the results.
+
                        REAL*8 vs
        do 20 i = 1, 5
+
                        REAL*8 rho
                print *, "Depth ", (i - 1) * 1000
+
                END TYPE ucvm_prop_t
                print *, "Vs ", returnData(i)%crust%vs  
+
         
                print *, "Vp ", returnData(i)%crust%vp  
+
        c      Returned data structure
                print *, "Rho ", returnData(i)%crust%rho
+
                TYPE :: ucvm_data_t
20      continue
+
                        REAL*8 surf
 
+
                        REAL*8 vs30
c      Close UCVM now that we've queried the points  
+
                        REAL*8 depth
        call ucvm_finalize()
+
                        INTEGER domain
 
+
                        REAL*8 shift_cr
        end
+
                        REAL*8 shift_gtl
 +
                        type(ucvm_prop_t) crust
 +
                        type(ucvm_prop_t) gtl
 +
                        type(ucvm_prop_t) cmb
 +
                END TYPE ucvm_data_t
 +
         
 +
        c      For our example we'll query five points
 +
                type(ucvm_point_t) point(5)
 +
        c      And we'll get back five sets of material properties
 +
                type(ucvm_data_t) returnData(5)
 +
         
 +
        c      Number of points is 5.
 +
                pts = 5
 +
         
 +
        c      We'll start at -118, 34 at 0 depth and go down by 1000m
 +
        c      each step
 +
                do 10 i = 1, 5
 +
                        point(i)%coord(1) = -118
 +
                        point(i)%coord(2) = 34
 +
                        point(i)%coord(3) = (i - 1) * 1000
 +
        10      continue
 +
         
 +
        c      Where is our configuration file?
 +
                ucvmconf = "/home/scec-01/davidgil/ucvm.conf" // CHAR(0)
 +
         
 +
        c      What model are we querying?
 +
                model = "cvmsi" // CHAR(0)
 +
         
 +
        c      Initialize UCVM
 +
                call ucvm_init(ucvmconf)
 +
         
 +
        c      Add the model to UCVM
 +
                call ucvm_add_model(model)
 +
         
 +
        c      Query the model. Note that the number of points is passed
 +
        c      by value, not reference.
 +
                call ucvm_query(%VAL(pts), point, returnData)
 +
         
 +
                print *, model, " results for lon -118, lat 34"
 +
         
 +
        c      Print out the results.
 +
                do 20 i = 1, 5
 +
                        print *, "Depth ", (i - 1) * 1000
 +
                        print *, "Vs ", returnData(i)%crust%vs  
 +
                        print *, "Vp ", returnData(i)%crust%vp  
 +
                        print *, "Rho ", returnData(i)%crust%rho
 +
        20      continue
 +
         
 +
        c      Close UCVM now that we've queried the points  
 +
                call ucvm_finalize()
 +
         
 +
                end

Latest revision as of 23:46, 22 June 2016

Calling UCVM With Fortran

Calling UCVM using Fortran is a relatively trivial procedure. In order to do so, you must install UCVM as per the guide, including the etree and Proj.4 libraries. It is also necessary to download and install any community velocity models that you will be calling. UCVM requires those velocity models to be added to a configuration file so that they can be referenced within the application.

Once that initial set up is done, compiling and linking with gfortran is easy. You must include the UCVM library, the Proj.4 library, the e-tree library, as well as any velocity model libraries that you have compiled into UCVM. For CVM-H, please note that there are actually two libraries required: lvxapi and lgeo.

Because the default convention for calling C programs from Fortran automatically appends an underscore to the end of the function name, you must turn that off via a flag called "fno-underscoring". This will make the Fortran compiler try and find foo() instead of foo_().

As an example, suppose we have a Fortran file, example.f, that calls UCVM. We have compiled UCVM with CVM-S and CVM-H. The code to compile example.f would be as follows:

gfortran example.f -o ./example -L./ucvm-13.9.0/inst/lib -L./cvms/lib -L./cvmh-11.9.1/inst/lib -L./proj-4.8.0/inst/lib -L./euclid3-1.3/libsrc -lucvm -lcvms -lvxapi -lgeo -lproj -letree -fno-underscoring

The basic structure of how to call UCVM within Fortran is outlined in the example below.

Example Code

               program example
        
       c       UCVM Configuration Location
               CHARACTER(LEN=80) ucvmconf
       c       Model Name
               CHARACTER(LEN=8) model 
       c       Number of points we're passing to ucvm_query
               INTEGER pts      
        
       c       The UCVM point data structure. 
       c       coord(1) is longitude
       c       coord(2) is latitutde
       c       coord(3) is depth
               TYPE :: ucvm_point_t
                      REAL*8 coord(3)
               END TYPE ucvm_point_t
        
       c       Generic property structure
       c       Source is where it comes from
       c       vp is P-wave velocity in m/s
       c       vs is S-wave velocity in m/s
       c       rho is density in kg/m^3
               TYPE :: ucvm_prop_t
                       INTEGER source
                       REAL*8 vp
                       REAL*8 vs
                       REAL*8 rho
               END TYPE ucvm_prop_t
        
       c       Returned data structure
               TYPE :: ucvm_data_t
                       REAL*8 surf
                       REAL*8 vs30
                       REAL*8 depth
                       INTEGER domain
                       REAL*8 shift_cr
                       REAL*8 shift_gtl
                       type(ucvm_prop_t) crust
                       type(ucvm_prop_t) gtl
                       type(ucvm_prop_t) cmb
               END TYPE ucvm_data_t
        
       c       For our example we'll query five points
               type(ucvm_point_t) point(5)
       c       And we'll get back five sets of material properties
               type(ucvm_data_t) returnData(5)
        
       c       Number of points is 5.
               pts = 5
        
       c       We'll start at -118, 34 at 0 depth and go down by 1000m
       c       each step
               do 10 i = 1, 5
                       point(i)%coord(1) = -118
                       point(i)%coord(2) = 34
                       point(i)%coord(3) = (i - 1) * 1000
       10      continue
        
       c       Where is our configuration file?
               ucvmconf = "/home/scec-01/davidgil/ucvm.conf" // CHAR(0)
        
       c       What model are we querying?
               model = "cvmsi" // CHAR(0)
        
       c       Initialize UCVM
               call ucvm_init(ucvmconf)
        
       c       Add the model to UCVM
               call ucvm_add_model(model)
        
       c       Query the model. Note that the number of points is passed
       c       by value, not reference.
               call ucvm_query(%VAL(pts), point, returnData)
        
               print *, model, " results for lon -118, lat 34"
        
       c       Print out the results.
               do 20 i = 1, 5
                       print *, "Depth ", (i - 1) * 1000
                       print *, "Vs ", returnData(i)%crust%vs 
                       print *, "Vp ", returnData(i)%crust%vp 
                       print *, "Rho ", returnData(i)%crust%rho
       20      continue
        
       c       Close UCVM now that we've queried the points 
               call ucvm_finalize()
        
               end