[cig-commits] r18121 - seismo/3D/SPECFEM3D_GLOBE/trunk/src/auxiliaries
danielpeter at geodynamics.org
danielpeter at geodynamics.org
Fri Mar 18 16:17:15 PDT 2011
Author: danielpeter
Date: 2011-03-18 16:17:15 -0700 (Fri, 18 Mar 2011)
New Revision: 18121
Modified:
seismo/3D/SPECFEM3D_GLOBE/trunk/src/auxiliaries/create_movie_GMT_global.f90
Log:
updates create_movie_GMT_global routine to avoid flickering
Modified: seismo/3D/SPECFEM3D_GLOBE/trunk/src/auxiliaries/create_movie_GMT_global.f90
===================================================================
--- seismo/3D/SPECFEM3D_GLOBE/trunk/src/auxiliaries/create_movie_GMT_global.f90 2011-03-16 23:49:28 UTC (rev 18120)
+++ seismo/3D/SPECFEM3D_GLOBE/trunk/src/auxiliaries/create_movie_GMT_global.f90 2011-03-18 23:17:15 UTC (rev 18121)
@@ -156,6 +156,8 @@
real(kind=CUSTOM_REAL) :: dist_lon,dist_lat,distance,mute_factor,val
character(len=256) line
real(kind=CUSTOM_REAL) :: cmt_hdur,cmt_t_shift,t0,hdur
+ real(kind=CUSTOM_REAL) :: xmesh,ymesh,zmesh
+ integer :: istamp1,istamp2
! ************** PROGRAM STARTS HERE **************
@@ -406,7 +408,8 @@
!--- ****** read data saved by solver ******
! --------------------------------------
-
+ istamp1 = 0
+ istamp2 = 0
iframe = 0
! loop on all the time steps in the range entered
@@ -671,6 +674,23 @@
field_display(ieoff) = dble(displn(i,j))
endif ! MOVIE_COARSE
+ ! determines noth / sourth pole index for stamping maximum values
+ if( USE_AVERAGED_MAXIMUM .and. NORMALIZE_VALUES ) then
+ xmesh = xp(ieoff)
+ ymesh = yp(ieoff)
+ zmesh = zp(ieoff)
+ if(zmesh > -SMALL_VAL_ANGLE .and. zmesh <= ZERO) zmesh = -SMALL_VAL_ANGLE
+ if(zmesh < SMALL_VAL_ANGLE .and. zmesh >= ZERO) zmesh = SMALL_VAL_ANGLE
+ thetaval = atan2(sqrt(xmesh*xmesh+ymesh*ymesh),zmesh)
+ ! thetaval between 0 and PI / 2
+ !print*,'thetaval:',thetaval * 180. / PI
+ ! close to north pole
+ if( thetaval >= 0.495 * PI ) istamp1 = ieoff
+ ! close to south pole
+ if( thetaval <= 0.01 ) istamp2 = ieoff
+ endif
+
+
enddo !i
enddo !j
@@ -710,21 +730,56 @@
max_average = max_average / nmax_history
endif
+ print *,'maximum amplitude averaged in current snapshot = ',max_absol
print *,'maximum amplitude over averaged last snapshots = ',max_average
! thresholds positive & negative maximum values
- where( field_display(:) > max_average ) field_display = max_average
- where( field_display(:) < - max_average ) field_display = -max_average
-
- ! updates current wavefield maxima
- min_field_current = minval(field_display(:))
- max_field_current = maxval(field_display(:))
- max_absol = (abs(min_field_current)+abs(max_field_current))/2.0
+ where( field_display(:) > max_absol ) field_display = max_absol
+ where( field_display(:) < - max_absol ) field_display = -max_absol
+ ! sets new maxima for decaying wavefield
+ ! this should avoid flickering when normalizing wavefields
+ if( NORMALIZE_VALUES ) then
+ ! checks stamp indices for maximum values
+ if( istamp1 == 0 ) istamp1 = ieoff
+ if( istamp2 == 0 ) istamp2 = ieoff-1
+ !print *, 'stamp: ',istamp1,istamp2
+
+ if( max_absol < max_average ) then
+ ! distance (in degree) of surface waves travelled
+ distance = 3.5 * ((it-1)*DT-t0) / 6371.0 * 180./PI
+ if( distance > 10.0 .and. distance <= 20.0 ) then
+ ! smooth transition between 10 and 20 degrees
+ ! sets positive and negative maximum
+ field_display(istamp1) = + max_absol + (max_average-max_absol) * (distance - 10.0)/10.0
+ field_display(istamp2) = - ( max_absol + (max_average-max_absol) * (distance - 10.0)/10.0 )
+ else if( distance > 20.0 ) then
+ ! sets positive and negative maximum
+ field_display(istamp1) = + max_average
+ field_display(istamp2) = - max_average
+ endif
+ else
+ ! thresholds positive & negative maximum values
+ where( field_display(:) > max_average ) field_display = max_average
+ where( field_display(:) < - max_average ) field_display = -max_average
+ ! sets positive and negative maximum
+ field_display(istamp1) = + max_average
+ field_display(istamp2) = - max_average
+ endif
+ ! updates current wavefield maxima
+ min_field_current = minval(field_display(:))
+ max_field_current = maxval(field_display(:))
+ max_absol = (abs(min_field_current)+abs(max_field_current))/2.0
+ endif
+
! scales field values up to match average
if( abs(max_absol) > TINYVAL) &
field_display = field_display * max_average / max_absol
+ ! thresholds after scaling positive & negative maximum values
+ where( field_display(:) > max_average ) field_display = max_average
+ where( field_display(:) < - max_average ) field_display = -max_average
+
! normalizes field values
if( NORMALIZE_VALUES ) then
if( MUTE_SOURCE ) then
@@ -757,8 +812,8 @@
val = 100.0 * max_average
endif
! positive and negative maximum
- field_display(ieoff) = + val
- field_display(ieoff-1) = - val
+ field_display(istamp1) = + val
+ field_display(istamp2) = - val
if( abs(max_average) > TINYVAL ) field_display = field_display / val
endif
else
More information about the CIG-COMMITS
mailing list