From 12019e8233f0efa34f6db58db0c813699e2e3802 Mon Sep 17 00:00:00 2001 From: Maksim Elizarev Date: Thu, 17 Oct 2024 16:36:16 +0100 Subject: [PATCH] refactor: :recycle: extract correlated field generator --- src/downscale.m | 38 ++------------------------------------ src/gen_corr_field.m | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 36 deletions(-) create mode 100644 src/gen_corr_field.m diff --git a/src/downscale.m b/src/downscale.m index a5d92c3..2d2f882 100644 --- a/src/downscale.m +++ b/src/downscale.m @@ -14,14 +14,14 @@ %% generate fine-scale porosity -sub_porosity = rsgen3D(dr,subscale_dims,downscale_params.corr_lens,@(N)sub_porosity); +sub_porosity = gen_corr_field(dr,subscale_dims,downscale_params.corr_lens,@(N)sub_porosity); sub_porosity = normalize(sub_porosity,porosity); sub_porosity = max(sub_porosity,0); %% calculate fine-scale permeability sub_permeability_log = log(sub_perm_x); -sub_permeability_log = rsgen3D(dr,subscale_dims,downscale_params.corr_lens,@(N)sub_permeability_log); +sub_permeability_log = gen_corr_field(dr,subscale_dims,downscale_params.corr_lens,@(N)sub_permeability_log); perm_x = perm_coarse(1); sub_permeability_log = normalize(sub_permeability_log,log(perm_x)); sub_perm_x = exp(sub_permeability_log); @@ -34,40 +34,6 @@ end end -function [f] = rsgen3D(dr,dims,corr_lens,dist) -arguments - dr (1,3) double - dims (1,3) uint32 - corr_lens (1,3) double - dist = @(N) randn(N) -end -x = linspace(-0.5,0.5,dims(1)).*dr(1)*(1 - 1/double(dims(1))); -y = linspace(-0.5,0.5,dims(2)).*dr(2)*(1 - 1/double(dims(2))); -z = linspace(-0.5,0.5,dims(3)).*dr(3)*(1 - 1/double(dims(3))); - -[X,Y,Z] = meshgrid(x,y,z); - -X = permute(X,[2 1 3]); -Y = permute(Y,[2 1 3]); -Z = permute(Z,[2 1 3]); - -D = dist(dims.*2-1); - -% Gaussian filter - - function out = divide(a,b) - out = a./b; - out(a==0)=0; - end - -K = divide(X,corr_lens(1)).^2 + divide(Y,corr_lens(2)).^2 + divide(Z,corr_lens(3)).^2; -K = exp(K.*(-2)); -K = K./sum(K(:)); - -f = convn(D,K,'valid'); - -end - function [data] = normalize(data,new_norm) arguments data double diff --git a/src/gen_corr_field.m b/src/gen_corr_field.m new file mode 100644 index 0000000..79a2fa9 --- /dev/null +++ b/src/gen_corr_field.m @@ -0,0 +1,34 @@ +function [f] = gen_corr_field(dr,dims,corr_lens,dist) +arguments + dr (1,3) double + dims (1,3) uint32 + corr_lens (1,3) double + dist = @(N) randn(N) +end +x = linspace(-0.5,0.5,dims(1)).*dr(1)*(1 - 1/double(dims(1))); +y = linspace(-0.5,0.5,dims(2)).*dr(2)*(1 - 1/double(dims(2))); +z = linspace(-0.5,0.5,dims(3)).*dr(3)*(1 - 1/double(dims(3))); + +[X,Y,Z] = meshgrid(x,y,z); + +X = permute(X,[2 1 3]); +Y = permute(Y,[2 1 3]); +Z = permute(Z,[2 1 3]); + +D = dist(dims.*2-1); + +% Gaussian filter + + function out = divide(a,b) + out = a./b; + out(a==0)=0; + end + +K = divide(X,corr_lens(1)).^2 + divide(Y,corr_lens(2)).^2 + divide(Z,corr_lens(3)).^2; +K = exp(K.*(-2)); +K = K./sum(K(:)); + +f = convn(D,K,'valid'); + +end +