image thumbnail
from Mogi: point source in elastic half-space by François Beauducel
Computes surface displacements, tilt and strain due to point source at depth

mogi.m
function [ur,uz,dt,er,et] = mogi(varargin)
%MOGI	Mogi's model (point source in elastic half-space).
%	[Ur,Uz,Dt,Er,Et] = MOGI(R,F,V,nu) or MOGI(R,F,A,P,E,nu) computes radial 
%	and vertical displacements Ur and Uz, ground tilt Dt, radial and 
%	tangential strain Er and Et on surface, at a radial distance R 
%	from the top of the source due to a hydrostatic pressure inside a 
%	sphere of radius A at depth F, in a homogeneous, semi-infinite elastic
%	body and approximation for A << F (center of dilatation). Formula by
%	Anderson [1936] and Mogi [1958].
%
%	MOGI(R,F,V) and MOGI(R,F,A,,P) are also allowed for compatibility 
%	(Mogi's original equation considers an isotropic material with Lam's 
%	constants equal, i.e., lambda = , Poisson's ratio = 0.25).
%
%	Input variables are:
%	   F: depth of the center of the sphere from the surface,
%	   V: volumetric change of the sphere,
%	   A: radius of the sphere,
%	   P: hydrostatic pressure change in the sphere,
%	   E: elasticity (Young's modulus),
%	  nu: Poisson's ratio,
%	   : rigidity (Lam's constant in case of isotropic material).
%
%	Notes:
%		- Equations are all vectorized, so variables R,F,V,A, and P are 
%		  scalar but any of them can be vector or matrix, then outputs 
%		  will be vector or matrix of the same size.
%		- Convention: Uz > 0 = UP, F is depth so in -Z direction.
%		- Units should be constistent, e.g.: R, F, A, Ur and Uz in m imply
%		  V in m3; E,  and P in Pa; Dt in rad, Er, Et and nu dimensionless.
%
%	Example for a 3-D plot of exagerated deformed surface due to a 1-bar
%	overpressure in a 10-cm radius sphere at 1-m depth in rock:
%	  [x,y] = meshgrid(-3:.1:3);
%	  [th,rho] = cart2pol(x,y);
%	  [ur,uz] = mogi(rho,1,0.1,1e5,10e9,0.25);
%	  [ux,uy] = pol2cart(th,ur);
%	  ps = 1e8;
%	  surf(x+ux*ps,y+uy*ps,uz*ps), axis equal, light
%
%	Author: Franois Beauducel <beauducel@ipgp.fr>
%	  Institut de Physique du Globe de Paris
%	Created: 1997
%	Updated: 2011-11-08
%
%	References:
%	  Anderson, E.M., Dynamics of the formation of cone-sheets, ring-dikes,
%		and cauldron-subsidences, Proc. R. Soc. Edinburgh, 56, 128-157,	1936.
%	  Mogi, K., Relations between the eruptions of various volcanoes and the
%		deformations of the ground surfaces around them, Bull. Earthquake Res.
%		Inst. Univ. Tokyo, 36, 99-134, 1958.

%	Copyright (c) 1997-2011, Franois Beauducel, covered by BSD License.
%	All rights reserved.
%
%	Redistribution and use in source and binary forms, with or without 
%	modification, are permitted provided that the following conditions are 
%	met:
%
%	   * Redistributions of source code must retain the above copyright 
%	     notice, this list of conditions and the following disclaimer.
%	   * Redistributions in binary form must reproduce the above copyright 
%	     notice, this list of conditions and the following disclaimer in 
%	     the documentation and/or other materials provided with the distribution
%	                           
%	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
%	AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
%	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
%	ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
%	LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
%	CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
%	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
%	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
%	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
%	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
%	POSSIBILITY OF SUCH DAMAGE.

error(nargchk(3,6,nargin))

for i = 1:nargin
	if ~isnumeric(varargin{i})
		error('All input arguments must be numeric.')
	end
end

% to check if input arguments have compatible sizes, constructs a complex
% vector of sizes, then uses UNIQUE on variables that are not scalar
sz = complex(cellfun('size',varargin,1),cellfun('size',varargin,2));
if length(unique(sz(find(sz~=complex(1,1))))) > 1
	error('All inputs must be scalar or matrix of the same size.')
end

r = varargin{1};
f = varargin{2};

switch nargin
	case 3	% MOGI(R,F,V)
		v = varargin{3};
		nu = 0.25;
	case 4	% MOGI(R,F,V,nu)
		v = varargin{3};
		nu = varargin{4};
	case 5	% MOGI(R,F,A,,P)
		a = varargin{3};
		mu = varargin{4};
		p = varargin{5};
		nu = 0.25;
	case 6	% MOGI(R,F,A,P,E,nu)
		a = varargin{3};
		p = varargin{4};		
		nu = varargin{6};
		mu = varargin{5}./(2*(1+nu));
end

if any(nargin==[3,4])
	y = v./pi;
else
	if max(max(a))/min(min(f)) > .1
		warning('Mogi: inaccurate results if F is not much greater than A.')
	end
	y = (a.^3).*p./mu;
end

R = sqrt(f.^2 + r.^2);	% radial distance from source
C = (1-nu).*y;		% intermediate constant

et = C./R.^3;		% tangential horizontal strain
ur = r.*et;		% radial horizontal displacement
uz = f.*et;		% vertical displacement

if nargout > 2
	dt = 3*C.*f.*r./R.^5;	% tilt
end
if nargout > 3
	er = C.*(f.^2 - 2*r.^2)./R.^5;	% radial horizontal strain
end

Contact us at files@mathworks.com