MCPcopy Create free account
hub / github.com/NGSolve/ngsolve / nonzero_pattern

Function nonzero_pattern

fem/tensorcoefficient.cpp:89–147  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

87 }
88
89 Vector<bool> nonzero_pattern(CoefficientFunction *cf) {
90 Vector<AutoDiffDiff<1,NonZero>> nzvec_ad(cf->Dimension());
91 Vector<NonZero> nzvec(cf->Dimension());
92 nzvec = NonZero(false);
93
94 ProxyUserData ud;
95 DummyFE<ET_TRIG> dummyfe;
96 ud.fel = &dummyfe;
97 ud.eval_deriv = 1;
98
99 Array<ProxyFunction *> trial_proxies, test_proxies;
100
101 cf->TraverseTree([&](CoefficientFunction &nodecf) {
102 auto proxy = dynamic_cast<ProxyFunction *>(&nodecf);
103 if (proxy) {
104 if (proxy->IsTestFunction()) {
105 if (!test_proxies.Contains(proxy)) {
106 test_proxies.Append(proxy);
107 }
108 } else if (!trial_proxies.Contains(proxy)) {
109 trial_proxies.Append(proxy);
110 }
111 }
112 });
113
114 cf->NonZeroPattern(ud, nzvec_ad);
115 for (size_t i: Range(nzvec_ad))
116 nzvec[i] = nzvec[i] || nzvec_ad[i].Value();
117
118 if (test_proxies.Size() && !trial_proxies.Size()) {
119 for (auto test_proxy : test_proxies)
120 for (int k2 : Range(test_proxy->Dimension())) {
121 ud.testfunction = test_proxy;
122 ud.test_comp = k2;
123 cf->NonZeroPattern(ud, nzvec_ad);
124 for (size_t i: Range(nzvec_ad))
125 nzvec[i] = nzvec[i] || nzvec_ad[i].Value();
126 }
127 } else {
128 for (auto trial_proxy : trial_proxies)
129 for (auto l2 : Range(trial_proxy->Dimension())) {
130 ud.trialfunction = trial_proxy;
131 ud.trial_comp = l2;
132 cf->NonZeroPattern(ud, nzvec_ad);
133 for (size_t i: Range(nzvec_ad))
134 nzvec[i] = nzvec[i] || nzvec_ad[i].Value();
135
136 for (auto test_proxy : test_proxies)
137 for (auto k2 : Range(test_proxy->Dimension())) {
138 ud.testfunction = test_proxy;
139 ud.test_comp = k2;
140 cf->NonZeroPattern(ud, nzvec_ad);
141 for (size_t i: Range(nzvec_ad))
142 nzvec[i] = nzvec[i] || nzvec_ad[i].Value();
143 }
144 }
145 }
146 return nzvec;

Callers 2

GenerateCodeMethod · 0.85

Calls 10

NonZeroClass · 0.85
ContainsMethod · 0.80
RangeFunction · 0.50
DimensionMethod · 0.45
TraverseTreeMethod · 0.45
AppendMethod · 0.45
NonZeroPatternMethod · 0.45
ValueMethod · 0.45
SizeMethod · 0.45
getMethod · 0.45

Tested by

no test coverage detected