/* * EasyWave - A realtime tsunami simulation program with GPU support. * Copyright (C) 2014 Andrey Babeyko, Johannes Spazier * GFZ German Research Centre for Geosciences (http://www.gfz-potsdam.de) * * Parts of this program (especially the GPU extension) were developed * within the context of the following publicly funded project: * - TRIDEC, EU 7th Framework Programme, Grant Agreement 258723 * (http://www.tridec-online.eu) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ #include #include #include #include #include "cOkadaEarthquake.h" #include "easywave.h" int Imin; int Imax; int Jmin; int Jmax; cOgrd uZ; #define SRC_GRD 1 #define SRC_FLT 2 //==================================================== int ewSource() { char dsaa_label[8]; int i,j,ierr,srcType; double lon,lat,dz,absuzmax,absuzmin; FILE *fp; cOkadaEarthquake eq; // check input file type: GRD or fault if( (fp = fopen( Par.fileSource, "rb" )) == NULL ) return Err.post( Err.msgOpenFile(Par.fileSource) ); memset( dsaa_label, 0, 5 ); ierr = fread( dsaa_label, 4, 1, fp ); if( !strcmp( dsaa_label,"DSAA" ) || !strcmp( dsaa_label,"DSBB" ) ) srcType = SRC_GRD; else srcType = SRC_FLT; fclose(fp); // load GRD file if( srcType == SRC_GRD) { ierr = uZ.readGRD( Par.fileSource ); if(ierr) return ierr; } // read fault(s) from file if( srcType == SRC_FLT) { int effSymSource = 0; long l; double dist,energy,factLat,effRad,effMax; ierr = eq.read( Par.fileSource ); if(ierr) return ierr; if( Par.adjustZtop ) { // check fault parameters Err.disable(); ierr = eq.finalizeInput(); while( ierr ) { i = ierr/10; ierr = ierr - 10*i; if( ierr == FLT_ERR_STRIKE ) { Log.print( "No strike on input: Employing effective symmetric source model" ); if( eq.nfault > 1 ) { Err.enable(); return Err.post("Symmetric source assumes only 1 fault"); } eq.fault[0].strike = 0.; effSymSource = 1; } else if( ierr == FLT_ERR_ZTOP ) { Log.print( "Automatic depth correction to fault top @ 10 km" ); eq.fault[i].depth = eq.fault[i].width/2 * sindeg(eq.fault[i].dip) + 10.e3; } else { Err.enable(); return ierr; } ierr = eq.finalizeInput(); } Err.enable(); } else { // check fault parameters Err.disable(); ierr = eq.finalizeInput(); if( ierr ) { i = ierr/10; ierr = ierr - 10*i; if( ierr != FLT_ERR_STRIKE ) { Err.enable(); ierr = eq.finalizeInput(); return ierr; } Log.print( "No strike on input: Employing effective symmetric source model" ); Err.enable(); if( eq.nfault > 1 ) return Err.post("symmetric source assumes only 1 fault"); eq.fault[0].strike = 0.; effSymSource = 1; ierr = eq.finalizeInput(); if(ierr) return ierr; } Err.enable(); } // calculate uplift on a rectangular grid // set grid resolution, grid dimensions will be set automatically uZ.dx = DLon; uZ.dy = DLat; ierr = eq.calculate( uZ ); if(ierr) return ierr; if( effSymSource ) { // integrate for tsunami energy energy = 0.; for( j=0; j Par.sshClipThreshold ) { Imin = My_min( Imin, i ); Imax = My_max( Imax, i ); Jmin = My_min( Jmin, j ); Jmax = My_max( Jmax, j ); } } } if( Imin == NLon ) return Err.post( "Zero initial displacement" ); Imin = My_max( Imin - 2, 2 ); Imax = My_min( Imax + 2, NLon-1 ); Jmin = My_max( Jmin - 2, 2 ); Jmax = My_min( Jmax + 2, NLat-1 ); printf_v("Imin, Imax, Jmin, Jmax: %u %u %u %u\n", Imin, Imax, Jmin, Jmax); return 0; } int setWaveHeights() { int i, j; double lon, lat, dz; CNode& Node = *gNode; Imin = NLon; Imax = 1; Jmin = NLat; Jmax = 1; for( i=1; i<=NLon; i++ ) { for( j=1; j<=NLat; j++ ) { lon = getLon(i); lat = getLat(j); //lon = (LonMinSec+(i-1)*DLon); //lat = (LatMinSec+(j-1)*DLat); if( Node(idx(j,i), iD) != 0. ) dz = Node(idx(j,i), iH) = uZ.getVal( lon,lat ); else dz = Node(idx(j,i), iH) = 0.; if( fabs(dz) > Par.sshClipThreshold ) { Imin = My_min( Imin, i ); Imax = My_max( Imax, i ); Jmin = My_min( Jmin, j ); Jmax = My_max( Jmax, j ); } } } Imin = My_max( Imin - 2, 2 ); Imax = My_min( Imax + 2, NLon-1 ); Jmin = My_max( Jmin - 2, 2 ); Jmax = My_min( Jmax + 2, NLat-1 ); printf_v("Imin, Imax, Jmin, Jmax: %u %u %u %u\n", Imin, Imax, Jmin, Jmax); return 0; }