Chi-Tech
sldfe_sq_01c_b_isolated.cc
Go to the documentation of this file.
1#include "sldfe_sq.h"
2
3#include "chi_runtime.h"
4#include "chi_log.h"
5
6//###################################################################
7/***/
12 chi_mesh::Vertex &sq_xy_tilde_centroid,
13 std::array<chi_mesh::Vector3, 4> &radii_vectors_xy_tilde,
14 std::array<double,4>& sub_sub_sqr_areas)
15{
16 auto& SA_i = sub_sub_sqr_areas;
17
18 //============================================= Declare algorithm utilities
19 FUNCTION_WEIGHT_FROM_RHO ComputeWeights(*this,
20 sq_xy_tilde_centroid,
21 radii_vectors_xy_tilde, sq, legendre);
22 double d = 1.0/sqrt(3.0);
23 chi_math::DynamicVector<double> rho = {d, d, d, d};
24 double epsilon = 1.0e-1;
25 chi_math::DynamicVector<double> delta = {epsilon, epsilon, epsilon, epsilon};
26 chi_math::DynamicVector<double> drho_df = {0.0, 0.0, 0.0, 0.0};
27
28 //============================================= Compute initial weights
29 auto weights = ComputeWeights(rho);
30
31 //============================================= Apply algorithm
32 Chi::log.Log() << "=================================================== ";
33 for (int k=0; k<150; ++k) //iteration
34 {
35// constexpr int N = 4;
36// double fac = 1.0/N;
37// std::array<std::array<double,4>,N> weights_offset;
38
39 auto weights_offset_pos = ComputeWeights(rho + delta);
40 auto weights_offset_neg = ComputeWeights(rho - delta);
41
42 double rho_change_total = 0.0;
43 for (int i=0; i<4; ++i)
44 {
45 double slope = 0.0;
46 slope += 0.5*(weights_offset_pos[i]-weights[i]);
47 slope -= 0.5*(weights_offset_neg[i]-weights[i]);
48 drho_df[i] = delta[i]/slope;
49
50 double delta_rho = 1.0*drho_df[i]*(SA_i[i] - weights[i]);
51
52// delta = {0.0,0.0,0.0,0.0}; delta[i] = epsilon;
53// auto weights_offset_pos = ComputeWeights(rho + delta);
54// double slope = (weights_offset_pos[i]-weights[i])/epsilon;
55//
56// double delta_rho = 10.0*slope*(SA_i[i]-weights[i]);
57
58
59 rho[i] += delta_rho;
60 rho[i] = std::fmax(0.0,rho[i]);
61 rho[i] = std::fmin(1.0,rho[i]);
62 rho_change_total -= 1.0*drho_df[i]*(weights[i]-SA_i[i]);
63 }
64
65 //================================= Update weights
66 weights = ComputeWeights(rho);
67 double change = 0.0;
68 for (int i=0; i<4; ++i)
69 change = std::fabs((weights[i] - SA_i[i])/weights[i]);
70
71 Chi::log.Log() << "Weights: "
72 << weights[0] << " "
73 << weights[1] << " "
74 << weights[2] << " "
75 << weights[3] << " ";
76 Chi::log.Log() << "Areas: "
77 << SA_i[0] << " "
78 << SA_i[1] << " "
79 << SA_i[2] << " "
80 << SA_i[3] << "\n";
81 Chi::log.Log() << "rhos: "
82 << rho[0] << " "
83 << rho[1] << " "
84 << rho[2] << " "
85 << rho[3] << "\n";
86 Chi::log.Log() << k<<" "<<std::fabs(change);
87 Chi::log.Log() << " ";
88
89
90 if (rho_change_total < 1.0e-2) break;
91// if (std::fabs(change) < 1.0e-2) break;
92 }
93// chi::log.Log() << "rhos: "
94// << rho[0]/(1.0/sqrt(3.0)) << " "
95// << rho[1]/(1.0/sqrt(3.0)) << " "
96// << rho[2]/(1.0/sqrt(3.0)) << " "
97// << rho[3]/(1.0/sqrt(3.0)) << "\n";
98
99 weights = ComputeWeights(rho);
100
101 for (int i=0; i<4; ++i)
102 {
103 auto xy_tilde = sq_xy_tilde_centroid +
104 rho[i]*radii_vectors_xy_tilde[i];
105 auto xyz_prime = sq.rotation_matrix*xy_tilde + sq.translation_vector;
106 sq.sub_sqr_points[i] = xyz_prime.Normalized();
107 sq.sub_sqr_weights[i] = weights[i];
108 }
109}
static chi::ChiLog & log
Definition: chi_runtime.h:81
LogStream Log(LOG_LVL level=LOG_0)
Definition: chi_log.cc:35
void IsolatedQPOptimization(SphericalQuadrilateral &sq, chi_math::QuadratureGaussLegendre &legendre, chi_mesh::Vertex &sq_xy_tilde_centroid, std::array< chi_mesh::Vector3, 4 > &radii_vectors_xy_tilde, std::array< double, 4 > &sub_sub_sqr_areas)
std::array< chi_mesh::Vector3, 4 > sub_sqr_points
Definition: sldfe_sq.h:45