Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/linalg/vector.cpp
3206 views
1
#ifdef abc
2
#include <mystdlib.h>
3
#include <linalg.hpp>
4
#include <algorithm>
5
6
namespace netgen
7
{
8
9
double BaseVector :: shit = 0;
10
11
// %FD Constructs a vector of length zero
12
BaseVector :: BaseVector ()
13
{
14
length = 0;
15
}
16
17
// %FD Constructs a vector of given length
18
BaseVector :: BaseVector (
19
INDEX alength // length of the vector
20
)
21
{
22
length = alength;
23
}
24
25
// %FD Sets length of the vector, old vector will be destroyed
26
void
27
BaseVector :: SetLength (
28
INDEX alength // new length of the vector
29
)
30
{
31
length = alength;
32
}
33
34
// %FD Changes length of the vector, old values stay valid
35
void
36
BaseVector :: ChangeLength (
37
INDEX alength // new length of the vector
38
)
39
{
40
length = alength;
41
}
42
43
44
45
// %FD { Write a vector with the help of the '<<' operator onto a stream }
46
ostream & // stream for further use
47
operator<< (
48
ostream & s, // stream to write vector onto
49
const BaseVector & v // vector to write
50
)
51
{
52
return v.Print (s);
53
}
54
55
56
// %FD{ Divides every component of the vector by the scalar c.
57
// The function checks for division by zero }
58
BaseVector & // result vector
59
BaseVector :: operator/= (
60
double c // scalar to divide by
61
)
62
{
63
if (c)
64
return (*this) *= (1/c);
65
else
66
{
67
(*myerr) << "operator/=: division by zero" << endl;
68
return *this;
69
}
70
}
71
72
73
// %FD Creates a copy of the object
74
BaseVector * // pointer to the new vector
75
BaseVector :: Copy () const
76
{
77
cerr << "Base_vector::Copy called" << endl << flush;
78
return NULL;
79
}
80
81
82
83
84
void BaseVector :: GetElementVector (const ARRAY<INDEX> & pnum,
85
BaseVector & elvec) const
86
{
87
int i;
88
for (i = 1; i <= pnum.Size(); i++)
89
elvec(i) = (*this)(pnum.Get(i));
90
}
91
92
void BaseVector :: SetElementVector (const ARRAY<INDEX> & pnum,
93
const BaseVector & elvec)
94
{
95
int i;
96
for (i = 1; i <= pnum.Size(); i++)
97
(*this)(pnum.Get(i)) = elvec(i);
98
}
99
100
101
void BaseVector :: AddElementVector (const ARRAY<INDEX> & pnum,
102
const BaseVector & elvec)
103
{
104
int i;
105
for (i = 1; i <= pnum.Size(); i++)
106
(*this)(pnum.Get(i)) += elvec(i);
107
}
108
109
110
111
112
113
114
115
116
117
118
119
TempVector :: ~TempVector ()
120
{
121
delete vec;
122
}
123
124
TempVector BaseVector :: operator+ (const BaseVector & v2) const
125
{
126
return (*Copy()) += v2;
127
}
128
129
TempVector BaseVector :: operator- (const BaseVector & v2) const
130
{
131
return (*Copy()) -= v2;
132
}
133
134
TempVector BaseVector :: operator- () const
135
{
136
return (*Copy()) *= -1;
137
}
138
139
140
TempVector operator* (const BaseVector & v1, double scal)
141
{
142
return (*v1.Copy()) *= scal;
143
}
144
145
TempVector operator/ (const BaseVector & v1, double scal)
146
{
147
return (*v1.Copy()) /= scal;
148
}
149
150
151
TempVector operator* (double scal, const BaseVector & v1)
152
{
153
return v1 * scal;
154
}
155
156
157
158
159
160
BaseVector * TempVector :: Copy () const
161
{
162
return vec->Copy();
163
}
164
165
166
167
168
169
170
171
172
173
174
double Vector :: shit = 0;
175
176
class clVecpool
177
{
178
public:
179
ARRAY<double *> vecs;
180
ARRAY<INDEX> veclens;
181
182
~clVecpool();
183
};
184
185
clVecpool :: ~clVecpool()
186
{
187
int i;
188
for (i = 1; i <= vecs.Size(); i++)
189
delete vecs.Elem(i);
190
}
191
192
static clVecpool vecpool;
193
194
195
196
static double * NewDouble (INDEX len)
197
{
198
if (len < 10)
199
return new double[len];
200
else
201
{
202
int i;
203
for (i = 1; i <= vecpool.veclens.Size(); i++)
204
if (vecpool.veclens.Get(i) == len)
205
{
206
double * hvec = vecpool.vecs.Get(i);
207
vecpool.vecs.DeleteElement(i);
208
vecpool.veclens.DeleteElement(i);
209
return hvec;
210
}
211
212
return new double[len];
213
}
214
}
215
216
static void DeleteDouble (INDEX len, double * dp)
217
{
218
if (len < 10)
219
delete [] dp;
220
else
221
{
222
vecpool.vecs.Append (dp);
223
vecpool.veclens.Append (len);
224
}
225
}
226
227
228
229
Vector :: Vector () : BaseVector()
230
{
231
data = NULL;
232
}
233
234
Vector :: Vector (INDEX alength) : BaseVector (alength)
235
{
236
if (length)
237
{
238
// data = new double[length];
239
data = NewDouble (length);
240
241
if (!data)
242
{
243
length = 0;
244
(*myerr) << "Vector not allocated" << endl;
245
}
246
}
247
else
248
data = NULL;
249
}
250
251
252
Vector :: Vector (const Vector & v2)
253
{
254
length = v2.length;
255
256
if (length)
257
{
258
// data = new double[length];
259
data = NewDouble (length);
260
261
if (data)
262
{
263
memcpy (data, v2.data, length * sizeof (double));
264
}
265
else
266
{
267
length = 0;
268
(*myerr) << "Vector::Vector : Vector not allocated" << endl;
269
}
270
}
271
else
272
data = NULL;
273
}
274
275
276
Vector :: ~Vector ()
277
{
278
// veclenfile << "~Vector delete: " << length << endl;
279
if (data)
280
{
281
DeleteDouble (length, data);
282
// delete [] data;
283
}
284
285
}
286
287
void Vector :: SetLength (INDEX alength)
288
{
289
if (length == alength) return;
290
291
if (data)
292
{
293
DeleteDouble (length, data);
294
// delete [] data;
295
}
296
data = NULL;
297
length = alength;
298
299
if (length == 0) return;
300
// data = new double[length];
301
data = NewDouble (length);
302
303
if (!data)
304
{
305
length = 0;
306
(*myerr) << "Vector::SetLength: Vector not allocated" << endl;
307
}
308
}
309
310
void Vector :: ChangeLength (INDEX alength)
311
{
312
(*mycout) << "Vector::ChangeLength called" << endl;
313
if (length == alength) return;
314
315
if (alength == 0)
316
{
317
// delete [] data;
318
DeleteDouble (length, data);
319
length = 0;
320
return;
321
}
322
323
double * olddata = data;
324
325
data = NewDouble (alength);
326
// data = new double[alength];
327
if (!data)
328
{
329
length = 0;
330
(*myerr) << "Vector::SetLength: Vector not allocated" << endl;
331
delete [] olddata;
332
}
333
334
memcpy (data, olddata, min2(alength, length));
335
336
delete [] olddata;
337
length = alength;
338
}
339
340
/// NEW RM
341
void Vector::SetBlockLength (INDEX /* blength */)
342
{
343
MyError("BaseVector::SetBlockLength was called for a Vector");
344
}
345
346
347
double & Vector :: operator() (INDEX i)
348
{
349
if (i >= 1 && i <= length) return Elem(i);
350
else (*myerr) << "\nindex " << i << " out of range ("
351
<< 1 << "," << Length() << ")\n";
352
return shit;
353
}
354
355
double Vector :: operator() (INDEX i) const
356
{
357
if (i >= 1 && i <= length) return Get(i);
358
else (*myerr) << "\nindex " << i << " out of range ("
359
<< 1 << "," << Length() << ")\n" << flush;
360
return shit;
361
}
362
363
364
365
double Vector :: SupNorm () const
366
{
367
double sup = 0;
368
369
for (INDEX i = 1; i <= Length(); i++)
370
if (fabs (Get(i)) > sup)
371
sup = fabs(Get(i));
372
373
return sup;
374
}
375
376
double Vector :: L2Norm () const
377
{
378
double sum = 0;
379
380
for (INDEX i = 1; i <= Length(); i++)
381
sum += Get(i) * Get(i);
382
383
return sqrt (sum);
384
}
385
386
double Vector :: L1Norm () const
387
{
388
double sum = 0;
389
390
for (INDEX i = 1; i <= Length(); i++)
391
sum += fabs (Get(i));
392
393
return sum;
394
}
395
396
double Vector :: Max () const
397
{
398
if (!Length()) return 0;
399
double m = Get(1);
400
for (INDEX i = 2; i <= Length(); i++)
401
if (Get(i) > m) m = Get(i);
402
return m;
403
}
404
405
double Vector :: Min () const
406
{
407
if (!Length()) return 0;
408
double m = Get(1);
409
for (INDEX i = 2; i <= Length(); i++)
410
if (Get(i) < m) m = Get(i);
411
return m;
412
}
413
414
415
/*
416
ostream & operator<<(ostream & s, const Vector & v)
417
{
418
int w = s.width();
419
if (v.Length())
420
{
421
s.width(0);
422
s << '(';
423
for (INDEX i = 1; i < v.Length(); i++)
424
{
425
s.width(w);
426
s << v.Get(i) << ",";
427
if (i % 8 == 0) s << endl << ' ';
428
}
429
s.width(w);
430
s << v.Get(v.Length()) << ')';
431
}
432
else
433
s << "(Vector not allocated)";
434
435
return s;
436
}
437
*/
438
439
ostream & Vector :: Print (ostream & s) const
440
{
441
int w = s.width();
442
if (Length())
443
{
444
s.width(0);
445
s << '(';
446
for (INDEX i = 1; i < Length(); i++)
447
{
448
s.width(w);
449
s << Get(i) << ",";
450
if (i % 8 == 0) s << endl << ' ';
451
}
452
s.width(w);
453
s << Get(Length()) << ')';
454
}
455
else
456
s << "(Vector not allocated)";
457
458
return s;
459
}
460
461
462
463
BaseVector & Vector :: operator+= (const BaseVector & v2)
464
{
465
const Vector & hv2 = v2.CastToVector();
466
467
if (Length() == hv2.Length())
468
for (INDEX i = 1; i <= Length(); i++)
469
Elem (i) += hv2.Get(i);
470
else
471
(*myerr) << "operator+= illegal dimension" << endl;
472
return *this;
473
}
474
475
BaseVector & Vector :: operator-= (const BaseVector & v2)
476
{
477
const Vector & hv2 = v2.CastToVector();
478
479
if (Length() == hv2.Length())
480
for (INDEX i = 1; i <= Length(); i++)
481
Elem (i) -= hv2.Get(i);
482
else
483
(*myerr) << "operator-= illegal dimension" << endl;
484
return *this;
485
}
486
487
BaseVector & Vector :: operator*= (double c)
488
{
489
for (INDEX i = 1; i <= Length(); i++)
490
Elem(i) *= c;
491
return *this;
492
}
493
494
495
496
BaseVector & Vector :: Add (double scal, const BaseVector & v2)
497
{
498
const Vector & hv2 = v2.CastToVector();
499
500
if (Length() == hv2.Length())
501
{
502
double * p1 = data;
503
double * p2 = hv2.data;
504
505
for (INDEX i = Length(); i > 0; i--)
506
{
507
(*p1) += scal * (*p2);
508
p1++; p2++;
509
}
510
}
511
else
512
(*myerr) << "Vector::Add: illegal dimension" << endl;
513
return *this;
514
}
515
516
BaseVector & Vector :: Add2 (double scal, const BaseVector & v2,
517
double scal3, const BaseVector & v3)
518
{
519
const Vector & hv2 = v2.CastToVector();
520
const Vector & hv3 = v3.CastToVector();
521
522
if (Length() == hv2.Length())
523
{
524
double * p1 = data;
525
double * p2 = hv2.data;
526
double * p3 = hv3.data;
527
528
for (INDEX i = Length(); i > 0; i--)
529
{
530
(*p1) += (scal * (*p2) + scal3 * (*p3));
531
p1++; p2++; p3++;
532
}
533
}
534
else
535
(*myerr) << "Vector::Add: illegal dimension" << endl;
536
return *this;
537
}
538
539
BaseVector & Vector :: Set (double scal, const BaseVector & v2)
540
{
541
const Vector & hv2 = v2.CastToVector();
542
543
if (Length() == hv2.Length())
544
{
545
double * p1 = data;
546
double * p2 = hv2.data;
547
548
for (INDEX i = Length(); i > 0; i--)
549
{
550
(*p1) = scal * (*p2);
551
p1++; p2++;
552
}
553
}
554
else
555
(*myerr) << "Vector::Set: illegal dimension" << endl;
556
return *this;
557
}
558
559
560
BaseVector & Vector :: Set2 (double scal , const BaseVector & v2,
561
double scal3, const BaseVector & v3)
562
{
563
const Vector & hv2 = v2.CastToVector();
564
const Vector & hv3 = v3.CastToVector();
565
566
if (Length() == hv2.Length() && Length() == hv3.Length())
567
{
568
double * p1 = data;
569
double * p2 = hv2.data;
570
double * p3 = hv3.data;
571
572
for (INDEX i = Length(); i > 0; i--)
573
{
574
(*p1) = scal * (*p2) + scal3 * (*p3);
575
p1++; p2++; p3++;
576
}
577
}
578
else
579
(*myerr) << "Vector::Set: illegal dimension" << endl;
580
return *this;
581
}
582
583
584
void Vector :: GetPart (int startpos, BaseVector & v2) const
585
{
586
Vector & hv2 = v2.CastToVector();
587
588
if (Length() >= startpos + v2.Length() - 1)
589
{
590
const double * p1 = &Get(startpos);
591
double * p2 = &hv2.Elem(1);
592
593
memcpy (p2, p1, hv2.Length() * sizeof(double));
594
}
595
else
596
MyError ("Vector::GetPart: Vector to short");
597
}
598
599
600
// NEW RM
601
void Vector :: SetPart (int startpos, const BaseVector & v2)
602
{
603
const Vector & hv2 = v2.CastToVector();
604
INDEX i;
605
INDEX n = v2.Length();
606
607
if (Length() >= startpos + n - 1)
608
{
609
double * p1 = &Elem(startpos);
610
const double * p2 = &hv2.Get(1);
611
612
for (i = 1; i <= n; i++)
613
{
614
(*p1) = (*p2);
615
p1++;
616
p2++;
617
}
618
}
619
else
620
MyError ("Vector::SetPart: Vector to short");
621
}
622
623
void Vector :: AddPart (int startpos, double val, const BaseVector & v2)
624
{
625
const Vector & hv2 = v2.CastToVector();
626
INDEX i;
627
INDEX n = v2.Length();
628
629
if (Length() >= startpos + n - 1)
630
{
631
double * p1 = &Elem(startpos);
632
const double * p2 = &hv2.Get(1);
633
634
for (i = 1; i <= n; i++)
635
{
636
(*p1) += val * (*p2);
637
p1++;
638
p2++;
639
}
640
}
641
else
642
MyError ("Vector::AddPart: Vector to short");
643
}
644
645
646
647
648
double Vector :: operator* (const BaseVector & v2) const
649
{
650
const Vector & hv2 = v2.CastToVector();
651
652
double sum = 0;
653
double * p1 = data;
654
double * p2 = hv2.data;
655
656
if (Length() == hv2.Length())
657
{
658
for (INDEX i = Length(); i > 0; i--)
659
{
660
sum += (*p1) * (*p2);
661
p1++; p2++;
662
}
663
}
664
else
665
(*myerr) << "Scalarproduct illegal dimension" << endl;
666
return sum;
667
}
668
669
void Vector :: SetRandom ()
670
{
671
INDEX i;
672
for (i = 1; i <= Length(); i++)
673
Elem(i) = rand ();
674
675
double l2 = L2Norm();
676
if (l2 > 0)
677
(*this) /= l2;
678
// Elem(i) = 1.0 / double(i);
679
// Elem(i) = drand48();
680
}
681
682
683
/*
684
TempVector Vector :: operator- () const
685
{
686
Vector & sum = *(Vector*)Copy();
687
688
if (sum.Length () == Length())
689
{
690
for (INDEX i = 1; i <= Length(); i++)
691
sum.Set (i, Get(i));
692
}
693
else
694
(*myerr) << "operator+ (Vector, Vector): sum.Length() not ok" << endl;
695
return sum;
696
}
697
*/
698
699
BaseVector & Vector::operator= (const Vector & v2)
700
{
701
SetLength (v2.Length());
702
703
if (data == v2.data) return *this;
704
705
if (v2.Length() == Length())
706
memcpy (data, v2.data, sizeof (double) * Length());
707
else
708
(*myerr) << "Vector::operator=: not allocated" << endl;
709
710
return *this;
711
}
712
713
BaseVector & Vector::operator= (const BaseVector & v2)
714
{
715
const Vector & hv2 = v2.CastToVector();
716
717
SetLength (hv2.Length());
718
719
if (data == hv2.data) return *this;
720
721
if (hv2.Length() == Length())
722
memcpy (data, hv2.data, sizeof (double) * Length());
723
else
724
(*myerr) << "Vector::operator=: not allocated" << endl;
725
726
return *this;
727
}
728
729
730
BaseVector & Vector::operator= (double scal)
731
{
732
if (!Length()) (*myerr) << "Vector::operator= (double) : data not allocated"
733
<< endl;
734
735
for (INDEX i = 1; i <= Length(); i++)
736
Set (i, scal);
737
738
return *this;
739
}
740
741
742
BaseVector * Vector :: Copy () const
743
{
744
return new Vector (*this);
745
}
746
747
748
void Vector :: Swap (BaseVector & v2)
749
{
750
Vector & hv2 = v2.CastToVector();
751
swap (length, hv2.length);
752
swap (data, hv2.data);
753
}
754
755
756
757
758
void Vector :: GetElementVector (const ARRAY<INDEX> & pnum,
759
BaseVector & elvec) const
760
{
761
int i;
762
Vector & helvec = elvec.CastToVector();
763
for (i = 1; i <= pnum.Size(); i++)
764
helvec.Elem(i) = Get(pnum.Get(i));
765
}
766
767
void Vector :: SetElementVector (const ARRAY<INDEX> & pnum,
768
const BaseVector & elvec)
769
{
770
int i;
771
const Vector & helvec = elvec.CastToVector();
772
for (i = 1; i <= pnum.Size(); i++)
773
Elem(pnum.Get(i)) = helvec.Get(i);
774
}
775
776
777
void Vector :: AddElementVector (const ARRAY<INDEX> & pnum,
778
const BaseVector & elvec)
779
{
780
int i;
781
const Vector & helvec = elvec.CastToVector();
782
for (i = 1; i <= pnum.Size(); i++)
783
Elem(pnum.Get(i)) += helvec.Get(i);
784
}
785
}
786
#endif
787
788