readmod_elastic.c 5.76 KB
Newer Older
tilman.metz's avatar
tilman.metz committed
1
/*-----------------------------------------------------------------------------------------
2
 * Copyright (C) 2016  For the list of authors, see file AUTHORS.
tilman.metz's avatar
tilman.metz committed
3
 *
Florian Wittkamp's avatar
Florian Wittkamp committed
4
 * This file is part of IFOS.
5
 *
Florian Wittkamp's avatar
Florian Wittkamp committed
6
 * IFOS is free software: you can redistribute it and/or modify
tilman.metz's avatar
tilman.metz committed
7 8
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 2.0 of the License only.
9
 *
Florian Wittkamp's avatar
Florian Wittkamp committed
10
 * IFOS is distributed in the hope that it will be useful,
tilman.metz's avatar
tilman.metz committed
11 12 13
 * 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.
14
 *
tilman.metz's avatar
tilman.metz committed
15
 * You should have received a copy of the GNU General Public License
Florian Wittkamp's avatar
Florian Wittkamp committed
16
 * along with IFOS. See file COPYING and/or <http://www.gnu.org/licenses/gpl-2.0.html>.
17
 -----------------------------------------------------------------------------------------*/
tilman.metz's avatar
tilman.metz committed
18 19

/*------------------------------------------------------------------------
20
 *   Read elastic model properties (vp,vs,density) from files
tilman.metz's avatar
tilman.metz committed
21 22 23 24 25
 *
 *  ----------------------------------------------------------------------*/


/* This file contains function readmod, which has the purpose
26
 to read data from model-files for viscoelastic simulation */
tilman.metz's avatar
tilman.metz committed
27 28 29 30

#include "fd.h"

void readmod_elastic(float  **  rho, float **  pi, float **  u){
31
    
32
    extern int NX, NY, NXG, NYG,  POS[3], MYID, PARAMETERIZATION,WAVETYPE;
33 34 35 36 37
    extern char  MFILE[STRING_SIZE];
    extern FILE *FP;
    
    
    /* local variables */
38
    float rhov, vp = 0.0, vs;
39
    int i, j, ii, jj;
40
    FILE *fp_vs, *fp_vp = NULL, *fp_rho;
41 42 43 44 45
    char filename[STRING_SIZE];
    
    
    
    
46
	   fprintf(FP,"\n...reading model information from model-files...\n");
47
       /* ----------------------------------- */
tilman.metz's avatar
tilman.metz committed
48 49
	   /* read density and seismic velocities */
	   /* ----------------------------------- */
50
	   if(PARAMETERIZATION==1){
51 52 53 54 55
           
           if(WAVETYPE==1||WAVETYPE==3){
               fprintf(FP,"\t Vp:\n\t %s.vp\n\n",MFILE);
               sprintf(filename,"%s.vp",MFILE);
               fp_vp=fopen(filename,"r");
56
               if (fp_vp==NULL) declare_error(" Could not open model file for Vp ! ");
tilman.metz's avatar
tilman.metz committed
57
           }
58 59 60 61 62
           
           
           fprintf(FP,"\t Vs:\n\t %s.vs\n\n",MFILE);
           sprintf(filename,"%s.vs",MFILE);
           fp_vs=fopen(filename,"r");
63
           if (fp_vs==NULL) declare_error(" Could not open model file for Vs ! ");
64 65 66 67
           
           fprintf(FP,"\t Density:\n\t %s.rho\n\n",MFILE);
           sprintf(filename,"%s.rho",MFILE);
           fp_rho=fopen(filename,"r");
68
           if (fp_rho==NULL) declare_error(" Could not open model file for densities ! ");
69 70
           
           
71
       } else {
tilman.metz's avatar
tilman.metz committed
72 73 74
	   
	   /* read density and Lame parameters */
	   /* ----------------------------------- */
75 76 77
           fprintf(FP,"\t Lame parameter lambda:\n\t %s.lam\n\n",MFILE);
           sprintf(filename,"%s.lam",MFILE);
           fp_vp=fopen(filename,"r");
78
           if (fp_vp==NULL) declare_error(" Could not open model file for Lame parameter lambda ! ");
79 80 81 82 83
           
           
           fprintf(FP,"\t Lame parameter mu:\n\t %s.mu\n\n",MFILE);
           sprintf(filename,"%s.mu",MFILE);
           fp_vs=fopen(filename,"r");
84
           if (fp_vs==NULL) declare_error(" Could not open model file for Lame parameter mu ! ");
85 86 87 88
           
           fprintf(FP,"\t Density:\n\t %s.rho\n\n",MFILE);
           sprintf(filename,"%s.rho",MFILE);
           fp_rho=fopen(filename,"r");
89
           if (fp_rho==NULL) declare_error(" Could not open model file for densities ! ");
90
       }
tilman.metz's avatar
tilman.metz committed
91
	   
92 93 94 95 96 97
    
    /* loop over global grid */
    for (i=1;i<=NXG;i++){
        for (j=1;j<=NYG;j++){
            
            if(WAVETYPE==1||WAVETYPE==3){
98 99
                
                if(feof(fp_vp)){
100
                    declare_error("Model file VP is to small. Check dimensions NX*NY of file.");
101 102
                }
                
103 104 105
                fread(&vp, sizeof(float), 1, fp_vp);
                
            }
106
            
107
            if(feof(fp_vs) || feof(fp_rho)){
108
                declare_error("Model file VS or RHO is to small. Check dimensions NX*NY of file.");
109 110
            }
            
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
            fread(&vs, sizeof(float), 1, fp_vs);
            fread(&rhov, sizeof(float), 1, fp_rho);
            
            
            /* only the PE which belongs to the current global gridpoint
             is saving model parameters in his local arrays */
            if ((POS[1]==((i-1)/NX)) &&
                (POS[2]==((j-1)/NY))){
                ii=i-POS[1]*NX;
                jj=j-POS[2]*NY;
                
                u[jj][ii]=vs;
                rho[jj][ii]=rhov;
                if(WAVETYPE==1||WAVETYPE==3){
                    pi[jj][ii]=vp;
                }
                
                
                
            }
        }
    }
    if(WAVETYPE==1||WAVETYPE==3){
134 135 136
        
        fread(&vp, sizeof(float), 1, fp_vp);
        if(!feof(fp_vp)){
137
            declare_error("Model file VP is to big. Check dimensions NX*NY of file.");
138
        }
139 140
        fclose(fp_vp);
    }
141 142 143
    
    fread(&vs, sizeof(float), 1, fp_vs);
    fread(&rho, sizeof(float), 1, fp_rho);
144
    if(!feof(fp_vs) || !feof(fp_rho)){
145
        declare_error("Model file VS or RHO is to big. Check dimensions NX*NY of file.");
146
    }
147 148 149 150 151 152 153
    fclose(fp_vs);
    fclose(fp_rho);
    
    
    
    /* each PE writes his model to disk */
    if(WAVETYPE==1||WAVETYPE==3){
154 155
        if(PARAMETERIZATION==1) sprintf(filename,"%s.out.vp",MFILE);
        if(PARAMETERIZATION==3) sprintf(filename,"%s.out.pi",MFILE);
156
        write_matrix_disk(pi, filename);
157 158
    }
    
159 160
    if(PARAMETERIZATION==1) sprintf(filename,"%s.out.vs",MFILE);
    if(PARAMETERIZATION==3) sprintf(filename,"%s.out.mu",MFILE);
161
    write_matrix_disk(u, filename);
162 163
    
    sprintf(filename,"%s.out.rho",MFILE);
164
    write_matrix_disk(rho, filename);
165
    
tilman.metz's avatar
tilman.metz committed
166 167 168 169 170
}