Stress Maps application added
This commit is contained in:
		
							
								
								
									
										593
									
								
								src/StressMaps/stress_maps_service.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										593
									
								
								src/StressMaps/stress_maps_service.m
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,593 @@
 | 
			
		||||
function stress_maps_service(root_folder, resolution, weightings, keyword, nparam, mc, stresstype, ldvalue, plot_fracs)
 | 
			
		||||
    
 | 
			
		||||
    % STRESS_MAPS_SERVICE Plot stress patterns associated with
 | 
			
		||||
    % the hydraulic fracturing of a shale gas well.  The data is based on
 | 
			
		||||
    % the physical and geological conditions at the Preese Hall Episode site.
 | 
			
		||||
    
 | 
			
		||||
    % STRESS_MAPS_SERVICE(ROOT_FOLDER, RESOLUTION, WEIGHTINGS, KEYWORD, NPARAM, MC, STRESSTYPE, LDVALUE)
 | 
			
		||||
    % plots a stress map at a high ([20]m) or low ([50]m) RESOLUTION for the STRESSTYPE
 | 
			
		||||
    % ([N]ormal, [S]hear or [C]oulomb) using a given source WEIGHTING ratio.  The parameter
 | 
			
		||||
    % to be plotted is defined in the variable KEYWORD (ISIP, FlowRate, PumpTime) and the value
 | 
			
		||||
    % of this in NPARAM. MC is the monte carlo iteration (1-50) and ROOT_FOLDER the location
 | 
			
		||||
    % of all the mat files.  The lateral distance is calculated using the
 | 
			
		||||
    % LDVALUE threshold
 | 
			
		||||
    
 | 
			
		||||
    % Input options for nparam:
 | 
			
		||||
    % dP  = [0.426 0.676 0.926 1.176 1.676 1.926 2.176 2.426 2.926 3.426 3.676 4.426 4.926 5.176 6.676 8.176 9.676 11.176 12.676 14.176 15.676 17.176 18.676 20.176 21.676 23.176 24.676 26.176 27.676 29.176]
 | 
			
		||||
    % FlowRate = [0.0983 0.1099 0.1215 0.1331 0.1446 0.1562 0.1678 0.1793 0.1909]
 | 
			
		||||
    % PumpTime = [30 60 90 120 150 180 210 240 270 300 330 360] 
 | 
			
		||||
    
 | 
			
		||||
    % version 1.1 20/12/2016 
 | 
			
		||||
    % Copyright 2016 Rachel Westwood, Keele University
 | 
			
		||||
   
 | 
			
		||||
    % This work is licensed under a Creative Commons Attribution-ShareAlike
 | 
			
		||||
    % 4.0 International License.  For full details of the license see
 | 
			
		||||
    % https://creativecommons.org/licenses/by-sa/4.0/legalcode
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    % Version History
 | 
			
		||||
    % 1.1 - corrected colorbar issue with 20m resolution and filename issue
 | 
			
		||||
    % with DP
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    % check the weightings to ensure they are correct
 | 
			
		||||
    if length(weightings) ~= 3
 | 
			
		||||
        error('source weighting combination must contain 3 elements');
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    if sum(weightings) ~= 1
 | 
			
		||||
        error('source weighting combination must add up to 1');
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    if ldvalue < 0.001 || ldvalue > 1
 | 
			
		||||
        error('Lateral respect distance stress threshold should be between 0.001 and 1 MPa');
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    % check that nparam is in the list
 | 
			
		||||
    dP = round(([37.25 37.5 37.75 38 38.5 38.75 39 39.25 39.75 40.25 40.5 41.25 41.75 42:1.5:66] - 36.824)*1000)/1000; % dP in MPa
 | 
			
		||||
    flow = round((8500:1000:16500) * 1.157e-5 * 10000)/10000; % flow in m3/s
 | 
			
		||||
    pumpt = 30:30:360;
 | 
			
		||||
    
 | 
			
		||||
    % if the keyword is differential pressure set it to ISIP.  For dP and
 | 
			
		||||
    % FlowRate adjust the nparam value.  Check that the parameters are
 | 
			
		||||
    % valid
 | 
			
		||||
    nparam_orig = nparam;
 | 
			
		||||
    keyword_orig = keyword;
 | 
			
		||||
    switch upper(keyword)
 | 
			
		||||
        case 'DP'
 | 
			
		||||
            keyword = 'ISIP';
 | 
			
		||||
            if isempty(find(dP == nparam, 1))
 | 
			
		||||
                error('Parameter value invalid');
 | 
			
		||||
            end
 | 
			
		||||
            nparam = (nparam + 36.824) * 1e6;
 | 
			
		||||
        case 'FLOWRATE'
 | 
			
		||||
            if isempty(find(flow == nparam, 1))
 | 
			
		||||
                error('Parameter value invalid');
 | 
			
		||||
            end
 | 
			
		||||
            nparam = round((nparam * 86400)/100)*100;
 | 
			
		||||
        case 'PUMPTIME'
 | 
			
		||||
            if isempty(find(pumpt == nparam, 1))
 | 
			
		||||
                error('Parameter value invalid');
 | 
			
		||||
            end
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    % generate empty matrices for the lateral distance calculation
 | 
			
		||||
    all_x = [];
 | 
			
		||||
    all_y = [];
 | 
			
		||||
    all_z = [];
 | 
			
		||||
    all_stress = [];
 | 
			
		||||
    
 | 
			
		||||
    % have to get the data for high and low res for the distance
 | 
			
		||||
    % calculation, will only plot the required one.
 | 
			
		||||
    
 | 
			
		||||
    for interval = [20 50]
 | 
			
		||||
        
 | 
			
		||||
        %set the index
 | 
			
		||||
        if interval == 20
 | 
			
		||||
            ind = 1;
 | 
			
		||||
        else
 | 
			
		||||
            ind = 2;
 | 
			
		||||
        end
 | 
			
		||||
        
 | 
			
		||||
        % generate the filenames of each of the mechanisms for 100% i, 100% s
 | 
			
		||||
        % and 100% d
 | 
			
		||||
        f_i = fullfile(root_folder, ...
 | 
			
		||||
            [keyword '_' num2str(nparam) '_i100-s0-d0_' ...
 | 
			
		||||
            num2str(interval) 'm.mat']);
 | 
			
		||||
        f_s = fullfile(root_folder, ...
 | 
			
		||||
            [keyword '_' num2str(nparam) '_i0-s100-d0_' ...
 | 
			
		||||
            num2str(interval) 'm.mat']);
 | 
			
		||||
        f_d = fullfile(root_folder, ...
 | 
			
		||||
            [keyword '_' num2str(nparam) '_i0-s0-d100_' ...
 | 
			
		||||
            num2str(interval) 'm.mat']);
 | 
			
		||||
        
 | 
			
		||||
        % check the mat files are there
 | 
			
		||||
        if ~exist(f_i, 'file') || ~exist(f_d, 'file') || ~exist(f_s, 'file')
 | 
			
		||||
            error(['Not all mat files are present: ' num2str(nparam_orig)]);
 | 
			
		||||
        end
 | 
			
		||||
        
 | 
			
		||||
        % Get the data from the mat files
 | 
			
		||||
        m_i = load(f_i);
 | 
			
		||||
        m_s = load(f_s);
 | 
			
		||||
        m_d = load(f_d);
 | 
			
		||||
        
 | 
			
		||||
        % save the x, y, z
 | 
			
		||||
        x_i = m_i.x;
 | 
			
		||||
        y_i = m_i.y;
 | 
			
		||||
        z_i = m_i.z;
 | 
			
		||||
        
 | 
			
		||||
        %         x = x_i(:);
 | 
			
		||||
        %         y = y_i(:);
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
        zz = zeros(length(x_i), 50);
 | 
			
		||||
        
 | 
			
		||||
        % get the correct stress matrix
 | 
			
		||||
        switch (upper(stresstype))
 | 
			
		||||
            case 'C'
 | 
			
		||||
                c_i = weightings(1) .* m_i.coulomb;
 | 
			
		||||
                c_s = weightings(2) .* m_s.coulomb;
 | 
			
		||||
                c_d = weightings(3) .* m_d.coulomb;
 | 
			
		||||
                st = 'Coulomb';
 | 
			
		||||
            case 'N'
 | 
			
		||||
                c_i = weightings(1) .* m_i.normal;
 | 
			
		||||
                c_s = weightings(2) .* m_s.normal;
 | 
			
		||||
                c_d = weightings(3) .* m_d.normal;
 | 
			
		||||
                st = 'Normal';
 | 
			
		||||
            case 'S'
 | 
			
		||||
                c_i = weightings(1) .* m_i.shear;
 | 
			
		||||
                c_s = weightings(2) .* m_s.shear;
 | 
			
		||||
                c_d = weightings(3) .* m_d.shear;
 | 
			
		||||
                st = 'Shear';
 | 
			
		||||
            otherwise
 | 
			
		||||
                error('Stress type not recognised');
 | 
			
		||||
        end
 | 
			
		||||
        
 | 
			
		||||
        % Add the stresses together
 | 
			
		||||
        c = c_i + c_s + c_d;
 | 
			
		||||
        
 | 
			
		||||
        %preallocate the maximum stress matrix
 | 
			
		||||
        lux = length(unique(x_i));
 | 
			
		||||
        luy = length(unique(y_i));
 | 
			
		||||
        stress_m = zeros(lux, luy, 50);
 | 
			
		||||
        s_m = zeros(lux*luy, 50);
 | 
			
		||||
        %xyz = zeros(50,1);
 | 
			
		||||
        
 | 
			
		||||
        % get the max stress for the required monte carlo iteration
 | 
			
		||||
        for jj = 1:50
 | 
			
		||||
            [stress_m(:,:,jj), xyz(jj)] = max_stress(x_i, y_i, z_i, c(:,:,jj)); %#ok<AGROW>
 | 
			
		||||
            s_m(:,jj) = reshape(stress_m(:,:,jj), [], 1);
 | 
			
		||||
            zz(:,jj) = xyz(jj).z(:);
 | 
			
		||||
        end
 | 
			
		||||
        
 | 
			
		||||
        all_x = [all_x; x_i(:)];
 | 
			
		||||
        all_y = [all_y; y_i(:)];
 | 
			
		||||
        all_z = [all_z; zz];
 | 
			
		||||
        all_stress = [all_stress; s_m];
 | 
			
		||||
      
 | 
			
		||||
        % plot the stress map
 | 
			
		||||
        if resolution == interval% get the fractures
 | 
			
		||||
            fx = m_i.fracturesX;
 | 
			
		||||
            fy = m_i.fracturesY;
 | 
			
		||||
            fracX = fx{mc};
 | 
			
		||||
            fracY = fy{mc};
 | 
			
		||||
            fig = plot_stress(fracX, fracY, stress_m(:,:,mc), xyz(mc), plot_fracs, st, resolution); 
 | 
			
		||||
        end
 | 
			
		||||
        
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    % calculate the lateral distance
 | 
			
		||||
    [mean_ld,  median_d, max_ld, min_ld] = ...
 | 
			
		||||
        lateralDistance(all_x, all_y, all_stress, ldvalue);
 | 
			
		||||
    
 | 
			
		||||
    % add the text with poisson ratio, youngs modulus, regional stress,
 | 
			
		||||
    % flow, area and lateral distance   
 | 
			
		||||
    filename = [keyword_orig '_' st '_' num2str(resolution) 'm_' ...
 | 
			
		||||
                num2str(nparam_orig) '_' ...
 | 
			
		||||
                num2str(weightings(1)*100) 'i' num2str(weightings(2)*100) 's' num2str(weightings(3)*100) 'r__' ... 
 | 
			
		||||
                num2str(mc)];
 | 
			
		||||
       saveText(filename, m_i, keyword, [mean_ld,  median_d, max_ld, min_ld], ldvalue, mc);
 | 
			
		||||
       saveas(fig, [filename '.jpg']);
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function saveText(filename, m_i, keyword, latdist, latdistthreshold, mc)
 | 
			
		||||
    % Function which generates additional information
 | 
			
		||||
    % and returns it in a cell array.
 | 
			
		||||
    fid = fopen([filename '.txt'], 'w');
 | 
			
		||||
    
 | 
			
		||||
    pr = m_i.poisson;
 | 
			
		||||
    ym = m_i.youngs * 100000 / 1e9;
 | 
			
		||||
    rs = m_i.regional_stress;
 | 
			
		||||
    fric = m_i.friction;
 | 
			
		||||
    dimensions = m_i.dimensions;
 | 
			
		||||
    res = dimensions(3);
 | 
			
		||||
    param_id = m_i.param_id;
 | 
			
		||||
    
 | 
			
		||||
    switch keyword
 | 
			
		||||
        case 'ISIP'
 | 
			
		||||
            keyword = 'dP';
 | 
			
		||||
            param = (param_id * 1e-6) - 36.824;
 | 
			
		||||
            param2 = '';
 | 
			
		||||
            unit = 'MPa';
 | 
			
		||||
        case 'FlowRate'
 | 
			
		||||
            param = param_id;
 | 
			
		||||
            unit = 'm^3/d';
 | 
			
		||||
            unit2 = 'm^3/s';
 | 
			
		||||
            param2 = [' (' num2str(param/86400, 5) ' ' unit2 ')'];
 | 
			
		||||
        case 'PumpTime'
 | 
			
		||||
            param = param_id;
 | 
			
		||||
            unit = 'mins';
 | 
			
		||||
            param2 = '';
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
        fprintf(fid, 'Calculation for: \n');
 | 
			
		||||
    fprintf(fid, '%s %u %s %s \n%u m resolution \n', keyword, param, unit, param2);
 | 
			
		||||
    fprintf(fid, 'Monte Carlo Iteration %u\n \n', mc);
 | 
			
		||||
    fprintf(fid, 'Geological Conditions: \n');
 | 
			
		||||
    fprintf(fid, 'Poisson ratio %2.2f\n', pr);
 | 
			
		||||
    fprintf(fid, 'Young''s modulus %2.2f GPa\n', ym);
 | 
			
		||||
    fprintf(fid, 'Friction %2.2f\n\n', fric);
 | 
			
		||||
    fprintf(fid, 'Regional Stress: %s \n\n', mat2str(rs));
 | 
			
		||||
    fprintf(fid, 'Lateral Respect Distance (lrd) data %2.3f MPa threshold\n', latdistthreshold);
 | 
			
		||||
    fprintf(fid, 'Mean lrd %4.2f \n', latdist(1)*1000);
 | 
			
		||||
    fprintf(fid, 'Median lrd %4.2f \n', latdist(2)*1000);
 | 
			
		||||
    fprintf(fid, 'Maximum lrd %4.2f \n', latdist(3)*1000);
 | 
			
		||||
    fprintf(fid, 'Minimum lrd %4.2f \n', latdist(4)*1000);
 | 
			
		||||
 | 
			
		||||
    fclose(fid);
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function [stress_max, xyz] = max_stress(x, y, z, stress)
 | 
			
		||||
    % MAX_STRESS compute the max or min stress over all depths
 | 
			
		||||
    
 | 
			
		||||
    % [MS, XYZ] = MAX_STRESS(X, Y, Z, STRESS)
 | 
			
		||||
    % Takes the X, Y, Z and STRESS vectors, representing a grid of
 | 
			
		||||
    % points and stress and returns the maximum and minimum stresses at
 | 
			
		||||
    % each radius in MPa
 | 
			
		||||
    
 | 
			
		||||
    stress = stress/10; % divide by 10 to get MPa
 | 
			
		||||
    
 | 
			
		||||
    % reshape the data to be a cube
 | 
			
		||||
    stress = reshape(stress, length(unique(x)), length(unique(y)), ...
 | 
			
		||||
        length(unique(z)), []);
 | 
			
		||||
    stress_max = stress;
 | 
			
		||||
    
 | 
			
		||||
    xyz.x = x(:);
 | 
			
		||||
    xyz.y = y(:);
 | 
			
		||||
    xyz.z = z(:);
 | 
			
		||||
    
 | 
			
		||||
    if ndims(stress_max) > 2  %#ok<ISMAT> % check how many levels of z we have
 | 
			
		||||
        
 | 
			
		||||
        % calculate using abs max at each x,y and make sign right
 | 
			
		||||
        [stress_max, max_position] = max(abs(stress),[],3);
 | 
			
		||||
        [~, min_position] = min(stress,[],3);
 | 
			
		||||
        stress_sign = (min_position == max_position) .* -1.0 ;
 | 
			
		||||
        stress_sign(stress_sign == 0) = 1;
 | 
			
		||||
        stress_max = stress_max .* stress_sign;
 | 
			
		||||
        xyz.z = z(max_position);
 | 
			
		||||
        
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function fig = plot_stress(fracX, fracY, stress, xyz, plot_fracs, stresstype, resolution)
 | 
			
		||||
    %PLOT_STRESS.  Plots the stress maps
 | 
			
		||||
    
 | 
			
		||||
    % PLOT_STRESS(FRACX, FRACY, STRESS, XYZ, PLOT_FRACS)
 | 
			
		||||
    % Reads in the maximum STRESS and XYZ and plots the stress maps, with
 | 
			
		||||
    % the option to overlay the fractures
 | 
			
		||||
    %
 | 
			
		||||
    % FRACX and FRACY are the x and y coordinates of the fractures
 | 
			
		||||
    % respectively.
 | 
			
		||||
    % STRESS is the stress in a m x n matrix
 | 
			
		||||
    % XYZ is a structure containing the x, y and z values as vectors
 | 
			
		||||
    % PLOT_FRACS is logical and states whether the fractures should be
 | 
			
		||||
    % plotted or not.
 | 
			
		||||
    
 | 
			
		||||
    if ~exist('plot_fracs', 'var') || isempty(plot_fracs)
 | 
			
		||||
        plot_fracs = 1;
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    % set the logical for plotting the fractures and the fontsize
 | 
			
		||||
    PLOT_FRACS = logical(plot_fracs);
 | 
			
		||||
    FONTSIZE = 14;
 | 
			
		||||
    
 | 
			
		||||
    % set the boundaries for clipping the data
 | 
			
		||||
    if resolution == 50
 | 
			
		||||
        clip = [-4e-4 4e-4];
 | 
			
		||||
        interval = 1e-5;
 | 
			
		||||
    else
 | 
			
		||||
        clip = [-4e-5 4e-5];
 | 
			
		||||
        interval = 1e-6;
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    % clip the data
 | 
			
		||||
    stress(stress < clip(1)) = clip(1);
 | 
			
		||||
    stress(stress > clip(2)) = clip(2);
 | 
			
		||||
    
 | 
			
		||||
    % set the colour levels
 | 
			
		||||
    c_levels = clip(1):interval:clip(2);
 | 
			
		||||
    
 | 
			
		||||
    % generate a new figure
 | 
			
		||||
    scrsz = get(groot,'ScreenSize');
 | 
			
		||||
    fig = figure('Position',[10 scrsz(4)/2-100 scrsz(3)/2 scrsz(4)/2]);
 | 
			
		||||
    
 | 
			
		||||
    % set the colourmap
 | 
			
		||||
    colormap(anatolia);
 | 
			
		||||
    
 | 
			
		||||
    % contour plot the stress and set the fontsize of the axis
 | 
			
		||||
    contourf(unique(xyz.x), unique(xyz.y), stress, c_levels, 'LineColor', 'none');
 | 
			
		||||
    shading interp
 | 
			
		||||
    
 | 
			
		||||
    set(gca, 'FontSize', FONTSIZE);%ax.FontSize = FONTSIZE;
 | 
			
		||||
    
 | 
			
		||||
    % plot contour lines - black for positive and grey for negative
 | 
			
		||||
    hold on
 | 
			
		||||
    contour(unique(xyz.x), unique(xyz.y), stress, 0:1e-5:1e-4, 'k');
 | 
			
		||||
    contour(unique(xyz.x), unique(xyz.y), stress, 0:-1e-5:-1e-4, 'LineColor', [.5 .5 .5]);
 | 
			
		||||
    hold off
 | 
			
		||||
    
 | 
			
		||||
    % set the labels
 | 
			
		||||
    xlabel('X (m)','FontSize',FONTSIZE)
 | 
			
		||||
    ylabel('Y (m)','FontSize',FONTSIZE)
 | 
			
		||||
    caxis (clip)
 | 
			
		||||
    
 | 
			
		||||
    % set axis details
 | 
			
		||||
    axis equal
 | 
			
		||||
    axis([min(xyz.x) max(xyz.x) min(xyz.y) max(xyz.y)]);
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    if PLOT_FRACS
 | 
			
		||||
        fcolour = [0 .7 0]; % green
 | 
			
		||||
        
 | 
			
		||||
        % get the number of fractures
 | 
			
		||||
        m = length(fracX(1,:));
 | 
			
		||||
        
 | 
			
		||||
        % cycle round and plot
 | 
			
		||||
        for k = 1:m
 | 
			
		||||
            line(fracX(:,k), fracY(:,k), 'LineStyle', '-', 'Color', fcolour);
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    % add the colourbar
 | 
			
		||||
    if resolution == 50
 | 
			
		||||
    hcb = colorbar('Location', 'EastOutside',...
 | 
			
		||||
        'Ticks', [-4e-4,-2e-4,0,2e-4,4e-4],...
 | 
			
		||||
        'TickLabels', {'-0.0004', '-0.0002', '0' '0.0002', '0.0004'}, ...
 | 
			
		||||
        'FontSize', 14);
 | 
			
		||||
    else
 | 
			
		||||
        hcb = colorbar('Location', 'EastOutside',...
 | 
			
		||||
        'Ticks', [-4e-5,-2e-5,0,2e-5,4e-5],...
 | 
			
		||||
        'TickLabels', {'-0.00004', '-0.00002', '0' '0.00002', '0.00004'}, ...
 | 
			
		||||
        'FontSize', 14);
 | 
			
		||||
    end
 | 
			
		||||
    title(hcb, [stresstype ' Stress (MPa)']);
 | 
			
		||||
    %set(get(get(hcb, 'Label'), 'String'), [stresstype ' Stress (MPa)']);
 | 
			
		||||
   
 | 
			
		||||
   
 | 
			
		||||
    % set the renderer
 | 
			
		||||
    set(gcf,'renderer','painters')
 | 
			
		||||
    
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function [a,b,r,s] = conv_hull(stress, x, y)
 | 
			
		||||
    %CONV_HULL. Obtains all the points of the max stress v radius with the conve hull
 | 
			
		||||
    %bound
 | 
			
		||||
    %
 | 
			
		||||
    % [A, B, R, S] = CONV_HULL(STRESS, X, Y)
 | 
			
		||||
    %
 | 
			
		||||
    % STRESS is the stress in a mxn matrix
 | 
			
		||||
    % X is the x values as vectors
 | 
			
		||||
    % Y is the y values as vectors
 | 
			
		||||
    %
 | 
			
		||||
    % A and B are the parameters to define the convex hull
 | 
			
		||||
    % R is the radius in km and S is the max stress
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    % set the centre point
 | 
			
		||||
    pt = [0,0];
 | 
			
		||||
    
 | 
			
		||||
    % calculate the radius from the centre of the fractures and sort
 | 
			
		||||
    radius = sqrt((x-pt(1)).^2 + (y-pt(2)).^2);
 | 
			
		||||
    [radius, idx]= sort(radius);
 | 
			
		||||
    
 | 
			
		||||
    % sort the stress into the same order as the radius
 | 
			
		||||
    stress = stress(:);
 | 
			
		||||
    stress = stress(idx);
 | 
			
		||||
    
 | 
			
		||||
    % get the unique radius
 | 
			
		||||
    r = unique(radius);
 | 
			
		||||
    
 | 
			
		||||
    % create a new array for the max stress at each radius
 | 
			
		||||
    s = zeros(size(r));
 | 
			
		||||
    
 | 
			
		||||
    % loop round to populate s
 | 
			
		||||
    for n = 1:length(s)
 | 
			
		||||
        ind = radius == r(n);
 | 
			
		||||
        s(n) = max(stress(ind));
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    % find all values of stress less than 0 and get rid of them
 | 
			
		||||
    ind = s <= 0;
 | 
			
		||||
    r(ind) = [];
 | 
			
		||||
    s(ind) = [];
 | 
			
		||||
    
 | 
			
		||||
    % Get rid of any radius close in (<0.25 km)
 | 
			
		||||
    r1 = r(r>0.25);
 | 
			
		||||
    s1 = s(r>0.25);
 | 
			
		||||
    
 | 
			
		||||
    % generate the convexhull
 | 
			
		||||
    ind = convhull(log(r1), log(s1));
 | 
			
		||||
    
 | 
			
		||||
    % number of points
 | 
			
		||||
    i = numel(ind);
 | 
			
		||||
    
 | 
			
		||||
    % loop round to find the first point on the curve
 | 
			
		||||
    while (r1(ind(i))<0.750) %& i>1
 | 
			
		||||
        i = i-1;
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    R1 = r1(ind(i));
 | 
			
		||||
    E1 = s1(ind(i));
 | 
			
		||||
    R2 = r1(ind(i+1));
 | 
			
		||||
    E2 = s1(ind(i+1));
 | 
			
		||||
    b = log(E1/E2)/log(R1/R2);
 | 
			
		||||
    a = E1/R1^b;
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function descr = outputText(m_i, keyword, latdist, latdistthreshold, mc)
 | 
			
		||||
    % Function which generates additional information
 | 
			
		||||
    % and returns it in a cell array.
 | 
			
		||||
    pr = m_i.poisson;
 | 
			
		||||
    ym = m_i.youngs * 100000 / 1e9;
 | 
			
		||||
    rs = m_i.regional_stress;
 | 
			
		||||
    fric = m_i.friction;
 | 
			
		||||
    dimensions = m_i.dimensions;
 | 
			
		||||
    res = dimensions(3);
 | 
			
		||||
    param_id = m_i.param_id;
 | 
			
		||||
    
 | 
			
		||||
    switch keyword
 | 
			
		||||
        case 'ISIP'
 | 
			
		||||
            keyword = 'dP';
 | 
			
		||||
            param = (param_id * 1e-6) - 36.824;
 | 
			
		||||
            param2 = '';
 | 
			
		||||
            unit = 'MPa';
 | 
			
		||||
        case 'FlowRate'
 | 
			
		||||
            param = param_id;
 | 
			
		||||
            unit = 'm^3/d';
 | 
			
		||||
            unit2 = 'm^3/s';
 | 
			
		||||
            param2 = [' (' num2str(param/86400, 5) ' ' unit2 ')'];
 | 
			
		||||
        case 'PumpTime'
 | 
			
		||||
            param = param_id;
 | 
			
		||||
            unit = 'mins';
 | 
			
		||||
            param2 = '';
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    descr = {'Calculation for:';
 | 
			
		||||
        [keyword ': ' num2str(param, 5) ' ' unit param2 ', ' ...
 | 
			
		||||
        num2str(res) 'm resolution'];
 | 
			
		||||
        ['Monte Carlo iteration: ' num2str(mc)];
 | 
			
		||||
        ' ';
 | 
			
		||||
        'Geological Conditions:';
 | 
			
		||||
        ['Poisson ratio ' num2str(pr)];
 | 
			
		||||
        ['Young''s modulus ' num2str(ym) ' GPa'];
 | 
			
		||||
        ['Friction ' num2str(fric)]
 | 
			
		||||
        '';
 | 
			
		||||
        'Regional Stress:';
 | 
			
		||||
        mat2str(rs)
 | 
			
		||||
        '';
 | 
			
		||||
        ['Lateral Respect Distance (lrd) data ' num2str(latdistthreshold) ...
 | 
			
		||||
        ' MPa threshold: ']
 | 
			
		||||
        ['Mean lrd ' num2str(latdist(1)*1000) ' m']
 | 
			
		||||
        ['Median lrd ' num2str(latdist(2)*1000) ' m']
 | 
			
		||||
        ['Maximum lrd ' num2str(latdist(3)*1000) ' m']
 | 
			
		||||
        ['Minimum lrd ' num2str(latdist(1)*1000) ' m'];
 | 
			
		||||
        };
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function [mean_ld, median_ld, max_ld, min_ld] = lateralDistance(x, y, stress, latdistthreshold)
 | 
			
		||||
    %LATERALDISTANCE Calculates the lateral distance using a convex
 | 
			
		||||
    % hull
 | 
			
		||||
    %
 | 
			
		||||
    % [MEAN_LD, MEDIAN_LD, MAX_LD, MIN_LD] = LATERALDISTANCE(X, Y, Z, STRESS, FRAC_CENT)
 | 
			
		||||
    %
 | 
			
		||||
    % X is the x values as a vector
 | 
			
		||||
    % Y is the y values as a vector
 | 
			
		||||
    % STRESS is the stress in a m x n matrix
 | 
			
		||||
    % LATDISTTHRESHOLD is the stress threshold to calculate the lateral
 | 
			
		||||
    % respect distance for
 | 
			
		||||
    
 | 
			
		||||
    % check if we are in km, if not, convert
 | 
			
		||||
    if max(abs(x)) > 10
 | 
			
		||||
        x = x/1000;
 | 
			
		||||
        y = y/1000;
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    % create a radius vector
 | 
			
		||||
    radius = zeros(1,50);
 | 
			
		||||
    
 | 
			
		||||
    % loop round all monte carlo iterations
 | 
			
		||||
    for jj = 1:50
 | 
			
		||||
        [a, b] = conv_hull(stress(:,jj), x, y);
 | 
			
		||||
        
 | 
			
		||||
        % compute the radius
 | 
			
		||||
        radius(jj) = (latdistthreshold/a)^(1/b);
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    mean_ld = mean(radius);
 | 
			
		||||
    median_ld = median(radius);
 | 
			
		||||
    max_ld = max(radius);
 | 
			
		||||
    min_ld = min(radius);
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function cmap = anatolia()
 | 
			
		||||
    % the Anatolia colormap
 | 
			
		||||
    
 | 
			
		||||
    cmap = ...
 | 
			
		||||
        [0.21176470816135406 0.15294118225574493 0.99215686321258545;
 | 
			
		||||
        0.21398124098777771 0.1877237856388092 0.99232739210128784;
 | 
			
		||||
        0.21619778871536255 0.22250640392303467 0.99249786138534546;
 | 
			
		||||
        0.21841432154178619 0.25728902220726013 0.99266839027404785;
 | 
			
		||||
        0.22063086926937103 0.29207161068916321 0.99283885955810547;
 | 
			
		||||
        0.22284740209579468 0.32685422897338867 0.99300938844680786;
 | 
			
		||||
        0.22506394982337952 0.36163684725761414 0.99317985773086548;
 | 
			
		||||
        0.22728048264980316 0.39641943573951721 0.99335038661956787;
 | 
			
		||||
        0.22949701547622681 0.43120205402374268 0.99352091550827026;
 | 
			
		||||
        0.23171356320381165 0.46598467230796814 0.99369138479232788;
 | 
			
		||||
        0.23393009603023529 0.5007672905921936 0.99386191368103027;
 | 
			
		||||
        0.23614664375782013 0.53554987907409668 0.99403238296508789;
 | 
			
		||||
        0.23836317658424377 0.57033246755599976 0.99420291185379028;
 | 
			
		||||
        0.24057972431182861 0.60511511564254761 0.9943733811378479;
 | 
			
		||||
        0.24279625713825226 0.63989770412445068 0.99454391002655029;
 | 
			
		||||
        0.2450128048658371 0.67468029260635376 0.99471437931060791;
 | 
			
		||||
        0.24722933769226074 0.70946294069290161 0.9948849081993103;
 | 
			
		||||
        0.24944587051868439 0.74424552917480469 0.9950554370880127;
 | 
			
		||||
        0.25166240334510803 0.77902811765670776 0.99522590637207031;
 | 
			
		||||
        0.25387895107269287 0.81381076574325562 0.99539643526077271;
 | 
			
		||||
        0.25609549880027771 0.84859335422515869 0.99556690454483032;
 | 
			
		||||
        0.25831204652786255 0.88337594270706177 0.99573743343353271;
 | 
			
		||||
        0.260528564453125 0.91815859079360962 0.99590790271759033;
 | 
			
		||||
        0.26274511218070984 0.9529411792755127 0.99607843160629272;
 | 
			
		||||
        0.35490196943283081 0.958823561668396 0.99656862020492554;
 | 
			
		||||
        0.44705882668495178 0.96470588445663452 0.99705880880355835;
 | 
			
		||||
        0.53921568393707275 0.970588207244873 0.99754899740219116;
 | 
			
		||||
        0.63137257099151611 0.97647058963775635 0.99803924560546875;
 | 
			
		||||
        0.7235293984413147 0.98235297203063965 0.99852943420410156;
 | 
			
		||||
        0.81568628549575806 0.98823529481887817 0.99901962280273438;
 | 
			
		||||
        0.90784311294555664 0.9941176176071167 0.99950981140136719;
 | 
			
		||||
        1 1 1;
 | 
			
		||||
        1 1 1;
 | 
			
		||||
        0.99901962280273438 0.99215686321258545 0.91372549533843994;
 | 
			
		||||
        0.99803924560546875 0.9843137264251709 0.82745099067687988;
 | 
			
		||||
        0.99705880880355835 0.97647058963775635 0.74117648601531982;
 | 
			
		||||
        0.99607843160629272 0.9686274528503418 0.65490198135375977;
 | 
			
		||||
        0.9950980544090271 0.96078431606292725 0.56862747669219971;
 | 
			
		||||
        0.9941176176071167 0.9529411792755127 0.48235294222831726;
 | 
			
		||||
        0.99313724040985107 0.94509804248809814 0.3960784375667572;
 | 
			
		||||
        0.99215686321258545 0.93725490570068359 0.30980393290519714;
 | 
			
		||||
        0.989599347114563 0.89650470018386841 0.29991474747657776;
 | 
			
		||||
        0.98704177141189575 0.85575449466705322 0.29002559185028076;
 | 
			
		||||
        0.98448425531387329 0.815004289150238 0.28013640642166138;
 | 
			
		||||
        0.981926679611206 0.77425402402877808 0.27024725079536438;
 | 
			
		||||
        0.97936916351318359 0.73350381851196289 0.260358065366745;
 | 
			
		||||
        0.97681158781051636 0.69275361299514771 0.25046887993812561;
 | 
			
		||||
        0.9742540717124939 0.65200340747833252 0.24057972431182861;
 | 
			
		||||
        0.97169649600982666 0.61125320196151733 0.23069053888320923;
 | 
			
		||||
        0.9691389799118042 0.57050299644470215 0.22080136835575104;
 | 
			
		||||
        0.966581404209137 0.529752790927887 0.21091219782829285;
 | 
			
		||||
        0.9640238881111145 0.48900255560874939 0.20102302730083466;
 | 
			
		||||
        0.96146631240844727 0.4482523500919342 0.19113385677337646;
 | 
			
		||||
        0.9589087963104248 0.407502144575119 0.18124467134475708;
 | 
			
		||||
        0.95635122060775757 0.36675190925598145 0.17135550081729889;
 | 
			
		||||
        0.95379370450973511 0.32600170373916626 0.1614663302898407;
 | 
			
		||||
        0.95123612880706787 0.28525149822235107 0.15157715976238251;
 | 
			
		||||
        0.94867861270904541 0.24450127780437469 0.14168798923492432;
 | 
			
		||||
        0.94612103700637817 0.20375107228755951 0.13179880380630493;
 | 
			
		||||
        0.94356352090835571 0.16300085186958313 0.12190964072942734;
 | 
			
		||||
        0.94100594520568848 0.12225063890218735 0.11202046275138855;
 | 
			
		||||
        0.938448429107666 0.081500425934791565 0.10213129222393036;
 | 
			
		||||
        0.93589085340499878 0.040750212967395782 0.092242114245891571;
 | 
			
		||||
        0.93333333730697632 0 0.08235294371843338];
 | 
			
		||||
end
 | 
			
		||||
		Reference in New Issue
	
	Block a user