32 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
36 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
41 Ainf = Eigen::Matrix< double, 6, 6 >::Zero( );
43 for(
int i=0; i <6; i++)
44 for(
int j=0; j <6; j++)
46 A[i][j] = Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic >::Zero( 1, 1 );;
47 B[i][j] = Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic >::Zero( 1, 1 );;
48 C[i][j] = Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic >::Zero( 1, 1 );;
49 D[i][j] = Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic >::Zero( 1, 1 );;
54 Eigen::Matrix<double, 6, 6> Ainf;
59 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> A[6][6];
60 Eigen::Matrix<double, Eigen::Dynamic, 1 > B[6][6];
61 Eigen::Matrix<double, 1 , Eigen::Dynamic> C[6][6];
62 Eigen::Matrix<double, Eigen::Dynamic, 1 > D[6][6];
68 virtual void Read(
const std::string &fname,
int flipPhaseForOSC =0) = 0;
69 virtual Eigen::Matrix<double,6,6> GetHToO() = 0;
72 const std::vector<std::string>&
Warnings()
const {
return m_warnings; }
73 void ClearWarnings() { m_warnings.clear(); }
75 virtual void SetOriginWorigin() = 0;
76 virtual void SetOriginGorigin() = 0;
77 virtual void SetOrigin( Eigen::Matrix<double,3,1> &r ) = 0;
79 Eigen::Matrix<double,6,6> GetMassRigidBody()
81 return GetHToO().transpose()*Mrbeig*GetHToO();
84 Eigen::Matrix<double,6,6> GetAinf(
unsigned int speedno=0)
86 return RadiationApproximation[speedno].Ainf;
89 Eigen::Matrix<double,6,6> GetMassTotal(
unsigned int speedno=0)
91 return RadiationApproximation[speedno].Ainf+GetHToO().transpose()*Mrbeig*GetHToO();
94 Eigen::Matrix<double,6,6> GetAw(
unsigned int FreqNo,
unsigned int SpeedNo=0)
96 return GetHToO().transpose()*A[SpeedNo][FreqNo]*GetHToO();
99 Eigen::Matrix<double,6,6> GetBw(
unsigned int FreqNo,
unsigned int SpeedNo=0)
101 return GetHToO().transpose()*B[SpeedNo][FreqNo]*GetHToO();
104 virtual Eigen::Matrix<double,6,6> GetCw(
unsigned int FreqNo,
unsigned int SpeedNo=0)
106 return GetHToO().transpose()*C[SpeedNo][FreqNo]*GetHToO();
109 Eigen::Matrix<double,1,Eigen::Dynamic> GetAij(
unsigned int DOF1,
unsigned int DOF2,
unsigned int SpeedNo=0)
111 Eigen::Matrix<double,1,Eigen::Dynamic> A = Eigen::Matrix<double,1,Eigen::Dynamic>::Zero(1,NoFrequency);
113 for(
unsigned int i=0; i < NoFrequency; i++)
115 Eigen::Matrix<double,6,6> Aw = GetAw(i,SpeedNo);
116 A(i) = Aw(DOF1,DOF2);
121 Eigen::Matrix<double,1,Eigen::Dynamic> GetBij(
unsigned int DOF1,
unsigned int DOF2,
unsigned int SpeedNo=0)
123 Eigen::Matrix<double,1,Eigen::Dynamic> B = Eigen::Matrix<double,1,Eigen::Dynamic>::Zero(1,NoFrequency);
125 for(
unsigned int i=0; i < NoFrequency; i++)
127 Eigen::Matrix<double,6,6> Bw = GetBw(i,SpeedNo);
128 B(i) = Bw(DOF1,DOF2);
133 Eigen::Matrix<double,1,Eigen::Dynamic> GetCij(
unsigned int DOF1,
unsigned int DOF2,
unsigned int SpeedNo=0)
135 Eigen::Matrix<double,1,Eigen::Dynamic> C = Eigen::Matrix<double,1,Eigen::Dynamic>::Zero(1,NoFrequency);
137 for(
unsigned int i=0; i < NoFrequency; i++)
139 Eigen::Matrix<double,6,6> Cw = GetCw(i,SpeedNo);
140 C(i) = Cw(DOF1,DOF2);
145 Eigen::Matrix<double,1,Eigen::Dynamic> GetSpeed()
147 Eigen::Matrix<double,1,Eigen::Dynamic> speed = Eigen::Matrix<double,1,Eigen::Dynamic>::Zero(1,NoSpeed);
148 for(
unsigned int i=0; i < NoSpeed; i++ ) speed(i) = Speed[i];
152 Eigen::Matrix<double,1,Eigen::Dynamic> GetHeading()
154 Eigen::Matrix<double,1,Eigen::Dynamic> head = Eigen::Matrix<double,1,Eigen::Dynamic>::Zero(1,NoHeading);
155 for(
unsigned int i=0; i < NoHeading; i++ ) head(i) = Heading[i];
159 Eigen::Matrix<double,1,Eigen::Dynamic> GetFrequency(
int SpeedNo=0)
161 Eigen::Matrix<double,1,Eigen::Dynamic> freq = Eigen::Matrix<double,1,Eigen::Dynamic>::Zero(1,NoFrequency);
162 for(
unsigned int i=0; i < NoFrequency; i++ ) freq(i) =
Frequency[SpeedNo][i];
166 virtual Eigen::Matrix<double,3,1> GetRg()
171 virtual Eigen::Matrix<double,3,1> GetRo()
178 Eigen::Matrix<double,6,1>
GetFirstOrderForce(
const Eigen::Matrix<double,3,1> &Kxy,
double ShipSpeed,
double RaoSpeed,
179 double WaveDirection,
double WaveAmplitude,
double WaveFrequency,
double WaveNumber,
double WavePhase,
184 double EncounterFrequency = WaveFrequency-WaveNumber*ShipSpeed;
185 double Direction = EncounterFrequency/std::abs(EncounterFrequency);
186 EncounterFrequency = std::abs(EncounterFrequency);
190 for(
int DOF=0; DOF < 6; DOF++)
193 std::complex<double> RAO = FroudeFrylov->GetRAOValue(DOF,WaveDirection,std::abs(RaoSpeed),WaveFrequency);
196 double Amplitude = std::abs(RAO);
197 double Phase = atan2( RAO.imag(), RAO.real() );
201 double ThisWaveHeight = WaveAmplitude*sin(EncounterFrequency *Time -Kxy(0) -Kxy(1) + Phase - WavePhase );
202 Fptr[DOF] = Direction*Amplitude*ThisWaveHeight;
205 Eigen::Map<Eigen::Matrix<double,6,1>,Eigen::Unaligned> tmp(Fptr);
206 return GetHToO().transpose()*tmp;
209 Eigen::Matrix<double,6,1> GetSecondOrderForce(Eigen::Matrix<double,3,1> ShipPosition,
double ShipSpeed,
210 double WaveDirection,
double WaveHeight,
double WaveFrequency,
double WaveNumber,
double WavePhase,
214 for(
int DOF=0; DOF < 6; DOF++)
218 std::complex<double> Amplitude = WaveDrift->GetRAOValue(DOF,ShipSpeed,WaveFrequency,WaveDirection);
219 Fptr[DOF] = std::pow(WaveHeight,2)*Amplitude.real();
222 Eigen::Map<Eigen::Matrix<double,6,1>,Eigen::Unaligned> tmp(Fptr);
223 return GetHToO().transpose()*tmp;
226 void GenerateZeroSpeedTimeDomainApproximation()
229 if( !RadiationApproximation.empty() ) RadiationApproximation.clear();
230 if( ZeroSpeedIdentificationFromCache() ){
237 FreqDomainIdent Identification;
238 Identification.SetPotentialData(
this);
239 Identification.IdentificationMethod(FreqDomainIdent::VECTOR_FITTING);
241 TimeDomainRadiation zeroSpeedSystem;
244 for(
int i=0; i < 6; i++)
247 for(
int j=0; j <= i; j++)
249 if( (i == 1 || i == 3 || i == 5) && (j==0 || j==2 || j==4) )
continue;
250 if( (j == 1 || j == 3 || j == 5) && (i==0 || i==2 || i==4) )
continue;
252 std::cout <<
"Identifying (i/j) = (" << i <<
"/" << j <<
") ";
254 if( is2Ddata() && (i!=0 && j!=0)){
255 FreqDomainIdent::StateSpace SS = Identification.IdentifySS(i,j);
256 zeroSpeedSystem.Ainf(i,j) = Identification.GetAinf(i,j);
257 zeroSpeedSystem.A[i][j] = SS.A;
258 zeroSpeedSystem.B[i][j] = SS.B;
259 zeroSpeedSystem.C[i][j] = SS.C;
260 zeroSpeedSystem.D[i][j] = SS.D;
262 zeroSpeedSystem.Ainf(j,i) = zeroSpeedSystem.Ainf(i,j);
263 zeroSpeedSystem.A[j][i] = zeroSpeedSystem.A[i][j];
264 zeroSpeedSystem.B[j][i] = zeroSpeedSystem.B[i][j];
265 zeroSpeedSystem.C[j][i] = zeroSpeedSystem.C[i][j];
266 zeroSpeedSystem.D[j][i] = zeroSpeedSystem.D[i][j];
268 std::cout <<
" Zero data" << std::endl;
269 zeroSpeedSystem.Ainf(i,j) = GetAij(i,j,0)[0];
270 zeroSpeedSystem.A[i][j] = Eigen::Matrix<double,1,1>::Zero();
271 zeroSpeedSystem.B[i][j] = Eigen::Matrix<double,1,1>::Zero();
272 zeroSpeedSystem.C[i][j] = Eigen::Matrix<double,1,1>::Zero();
273 zeroSpeedSystem.D[i][j] = Eigen::Matrix<double,1,1>::Zero();
275 zeroSpeedSystem.Ainf(j,i) = GetAij(i,j,0)[0];
276 zeroSpeedSystem.A[j][i] = Eigen::Matrix<double,1,1>::Zero();
277 zeroSpeedSystem.B[j][i] = Eigen::Matrix<double,1,1>::Zero();
278 zeroSpeedSystem.C[j][i] = Eigen::Matrix<double,1,1>::Zero();
279 zeroSpeedSystem.D[j][i] = Eigen::Matrix<double,1,1>::Zero();
283 RadiationApproximation.insert( std::make_pair(0,zeroSpeedSystem));
284 ZeroSpeedIdentificaitonToCache();
287 void GenerateTimeDomainApproximation()
290 if( IdentificationFromCache() )
return;
292 FreqDomainIdent Identification;
293 Identification.SetPotentialData(
this);
294 Identification.IdentificationMethod(FreqDomainIdent::VECTOR_FITTING);
296 for (
unsigned int speed=0; speed < NoSpeed; speed++ )
298 TimeDomainRadiation speedSystem;
300 for(
int i=0; i < 6; i++)
302 for(
int j=0; j <= i; j++)
304 if( (i == 1 || i == 3 || i == 5) && (j==0 || j==2 || j==4) )
continue;
305 if( (j == 1 || j == 3 || j == 5) && (i==0 || i==2 || i==4) )
continue;
307 std::cout <<
"Identifying (i/j) = ("<<speed<<
")(" << i <<
"/" << j <<
") ";
309 if( is2Ddata() && (i==0||j==0)){
310 FreqDomainIdent::StateSpace SS = Identification.IdentifySS(i,j,speed);
311 speedSystem.Ainf(i,j) = Identification.GetAinf(i,j,speed);
312 speedSystem.A[i][j] = SS.A;
313 speedSystem.B[i][j] = SS.B;
314 speedSystem.C[i][j] = SS.C;
315 speedSystem.D[i][j] = SS.D;
317 speedSystem.Ainf(j,i) = speedSystem.Ainf(i,j);
318 speedSystem.A[j][i] = speedSystem.A[i][j];
319 speedSystem.B[j][i] = speedSystem.B[i][j];
320 speedSystem.C[j][i] = speedSystem.C[i][j];
321 speedSystem.D[j][i] = speedSystem.D[i][j];
323 FreqDomainIdent::StateSpace SS = Identification.IdentifySS(i,j);
324 speedSystem.Ainf(i,j) = GetAij(i,j,speed)[0];
325 speedSystem.A[i][j] = Eigen::Matrix<double,1,1>::Zero();
326 speedSystem.B[i][j] = Eigen::Matrix<double,1,1>::Zero();
327 speedSystem.C[i][j] = Eigen::Matrix<double,1,1>::Zero();
328 speedSystem.D[i][j] = Eigen::Matrix<double,1,1>::Zero();
330 speedSystem.Ainf(j,i) = GetAij(i,j,speed)[0];
331 speedSystem.A[j][i] = Eigen::Matrix<double,1,1>::Zero();
332 speedSystem.B[j][i] = Eigen::Matrix<double,1,1>::Zero();
333 speedSystem.C[j][i] = Eigen::Matrix<double,1,1>::Zero();
334 speedSystem.D[j][i] = Eigen::Matrix<double,1,1>::Zero();
337 std::cout <<
"identified new data - " << std::endl;
340 RadiationApproximation.insert( std::make_pair(speed,speedSystem));
342 IdentificaitonToCache();
348 Eigen::Matrix<double,6,6> M = GetMassRigidBody();
350 std::cout <<
"%Ship information form file: " << fname << std::endl;
351 std::cout <<
"%\tLpp:\t" << Lpp << std::endl;
352 std::cout <<
"%\tB:\t" << Bredth << std::endl;
353 std::cout <<
"%\tT:\t" << Draught << std::endl;
354 std::cout <<
"%\tr_cg\t" << LCG<<
"\t,\t0\t,\t"<<VCG<<
" (from AP and base line)" << std::endl;
355 std::cout <<
"%\tr_cb\t" << LCB<<
"\t,\t0\t,\t"<<VCB<<
" (from AP and base line)" << std::endl;
357 std::cout <<
"%\tPotential data set information: " << std::endl;
358 std::cout <<
"%\t\tNumber of speeds:\t" <<NoSpeed<< std::endl;
359 std::cout <<
"speed = [\t\t" ;
360 for(
unsigned int i=0; i < NoSpeed; i++ ) std::cout << Speed[i] <<
"\t";
361 std::cout <<
"];" << std::endl;
363 std::cout <<
"%\t\tNumber of headings:\t" <<NoHeading<< std::endl;
364 std::cout <<
"head =[\t\t" ;
365 for(
unsigned int i=0; i < NoHeading; i++ ) std::cout << Heading[i] <<
"\t";
366 std::cout <<
"];" << std::endl;
368 std::cout <<
"%\t\tNumber of frequencies:\t" <<NoFrequency<< std::endl;
369 std::cout <<
"freq =[\t\t" ;
372 std::cout <<
"];" << std::endl;
374 for(
unsigned int i=0; i < NoSpeed; i++ )
376 std::cout <<
"%Total mass matrix for Speed " << i <<
" V="<<Speed[i] <<
" m/s" << std::endl;
378 Eigen::Matrix<double,6,6> Ainf = GetAinf(i);
380 Eigen::Matrix<double,6,6> Mtotal = M + Ainf;
381 std::cout << std::scientific;
382 for(
int j=0; j < 6; j++)
384 if( j== 0) std::cout <<
"M{" <<i+1<<
"}\t=[";
385 std::cout <<std::setprecision(4) <<
"\t"<< Mtotal(j,0) <<
"\t," << Mtotal(j,1) <<
"\t," << Mtotal(j,2) <<
"\t," << Mtotal(j,3) <<
"\t," << Mtotal(j,4) <<
"\t,"<<Mtotal(j,5);
386 if( j== 5) std::cout <<
"];";
387 std::cout <<
";" <<std::endl;
393 for(
unsigned int i=0; i < NoSpeed; i++)
395 std::cout <<
"%Fluid memory model for Speed " << i <<
" V="<<Speed[i] <<
" m/s" << std::endl;
396 TimeDomainRadiation mod = RadiationApproximation[i];
398 for(
int j=0; j < 6; j++ )
400 for(
int k=0; k < 6; k++ )
402 size_t num_states = mod.A[k][j].cols();
404 if( num_states == 1 )
406 std::cout <<
"A{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}" <<
"=\t" <<
"[" << mod.A[j][k](0,0) <<
"];"<< std::endl;
407 std::cout << std::endl;
408 std::cout <<
"B{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}" <<
" =\t" <<
"[" << mod.B[j][k](0,0) <<
"];"<< std::endl;
409 std::cout << std::endl;
410 std::cout <<
"C{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}" <<
" =\t" <<
"[" << mod.C[j][k](0,0) <<
"];"<< std::endl;
411 std::cout << std::endl;
412 std::cout <<
"D{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}" <<
" =\t" <<
"[" << mod.D[j][k](0,0) <<
"];"<< std::endl;
414 else if (num_states == 2 )
416 std::cout <<
"A{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[" << mod.A[j][k](0,0) <<
"\t,"<<mod.A[j][k](0,1)<<
"\t;" << mod.A[j][k](1,0) <<
"\t,"<<mod.A[j][k](1,1)<<
"\t;"<<
"];"<< std::endl;
417 std::cout << std::endl;
418 std::cout <<
"B{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[" << mod.B[j][k](0,0) <<
"\t;" << mod.B[j][k](1,0) <<
"];"<< std::endl;
419 std::cout << std::endl;
420 std::cout <<
"C{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[" << mod.C[j][k](0,0) <<
"\t," << mod.C[j][k](0,1) <<
"];"<< std::endl;
421 std::cout << std::endl;
422 std::cout <<
"D{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[" << mod.D[j][k](0,0) <<
"];"<< std::endl;
427 std::cout <<
"A{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[";
428 for(
size_t s=0; s < num_states; s++)
430 if(s!=0) std::cout <<
" \t ";
431 for(
size_t c=0; c < num_states; c++)
433 std::cout << mod.A[j][k](s,c);
434 if( c < (num_states-1) ) std::cout <<
"\t,";
436 if( s < (num_states-1) ) std::cout << std::endl;
438 std::cout <<
"];"<< std::endl;
440 std::cout << std::endl;
441 std::cout <<
"B{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[";
442 for(
size_t s=0; s < num_states; s++)
444 if( s != 0 )std::cout <<
" \t ";
445 std::cout << mod.B[j][k](s,0);
446 if( s < (num_states-1) ) std::cout <<
";" <<std::endl;
448 std::cout <<
"];"<< std::endl;
449 std::cout << std::endl;
451 std::cout <<
"C{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[";
452 for(
size_t s=0; s < num_states; s++)
454 std::cout << mod.C[j][k](0,s);
455 if( s < (num_states-1) ) std::cout <<
",";
457 std::cout <<
"];"<< std::endl;
459 std::cout << std::endl;
460 std::cout <<
"D{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[" << mod.D[j][k](0,0) <<
"];"<< std::endl;
467 size_t GetTimeDomainStateSize(
int DOF1,
int DOF2,
int SpeedNo=0 )
469 return RadiationApproximation[SpeedNo].A[DOF1][DOF2].cols();
472 void ZeroSpeedIdentificaitonToCache()
474 std::string cachebase = fname;
475 std::stringstream ss; ss << cachebase <<
".identcache0";
477 std::fstream cache(ss.str().c_str(),std::ios::out|std::ios::binary);
484 for(
int i=0; i < 6; i++)
486 for(
int j=0; j < 6; j++)
491 a_size[0] =
static_cast<int>(RadiationApproximation[0].A[i][j].rows());
492 a_size[1] =
static_cast<int>(RadiationApproximation[0].A[i][j].cols());
494 cache.write(
reinterpret_cast<char*
>(a_size),
sizeof(a_size) );
495 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[0].A[i][j].data()),
sizeof(
double)*a_size[0]*a_size[1] );
500 b_size[0] =
static_cast<int>(RadiationApproximation[0].B[i][j].rows());
501 b_size[1] =
static_cast<int>(RadiationApproximation[0].B[i][j].cols());
503 cache.write(
reinterpret_cast<char*
>(b_size),
sizeof(b_size) );
504 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[0].B[i][j].data()),
sizeof(
double)*b_size[0]*b_size[1] );
510 c_size[0] =
static_cast<int>(RadiationApproximation[0].C[i][j].rows());
511 c_size[1] =
static_cast<int>(RadiationApproximation[0].C[i][j].cols());
513 cache.write(
reinterpret_cast<char*
>(c_size),
sizeof(c_size) );
514 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[0].C[i][j].data()),
sizeof(
double)*c_size[0]*c_size[1] );
519 d_size[0] =
static_cast<int>(RadiationApproximation[0].D[i][j].rows());
520 d_size[1] =
static_cast<int>(RadiationApproximation[0].D[i][j].cols());
522 cache.write(
reinterpret_cast<char*
>(d_size),
sizeof(d_size) );
523 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[0].D[i][j].data()),
sizeof(
double)*d_size[0]*d_size[1] );
529 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[0].Ainf.data()),
sizeof(
double)*6*6 );
533 bool ZeroSpeedIdentificationFromCache()
535 std::string cachebase = fname;
536 std::stringstream ss; ss << cachebase <<
".identcache0";
537 std::fstream cache(ss.str().c_str(),std::ios::in|std::ios::binary);
538 if( !cache.good() )
return false;
545 double Ainf_tmp[6*6];
546 TimeDomainRadiation radiationModel;
547 for(
int i=0; i < 6; i++)
549 for(
int j=0; j < 6; j++)
551 cache.read(
reinterpret_cast<char*
>(a_size),
sizeof(a_size) );
552 std::vector<double> A_tmp( a_size[0]*a_size[1] );
554 cache.read(
reinterpret_cast<char*
>(A_tmp.data()),
sizeof(
double)*a_size[0]*a_size[1] );
557 cache.read(
reinterpret_cast<char*
>(b_size),
sizeof(b_size) );
558 std::vector<double> B_tmp( b_size[0]*b_size[1] );
560 cache.read(
reinterpret_cast<char*
>(B_tmp.data()),
sizeof(
double)*b_size[0]*b_size[1] );
562 cache.read(
reinterpret_cast<char*
>(c_size),
sizeof(c_size) );
563 std::vector<double> C_tmp( c_size[0]*c_size[1] );
565 cache.read(
reinterpret_cast<char*
>(C_tmp.data()),
sizeof(
double)*c_size[0]*c_size[1] );
568 cache.read(
reinterpret_cast<char*
>(d_size),
sizeof(d_size) );
569 std::vector<double> D_tmp( d_size[0]*d_size[1] );
571 cache.read(
reinterpret_cast<char*
>(D_tmp.data()),
sizeof(
double)*d_size[0]*d_size[1] );
575 radiationModel.A[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(a_size[0],a_size[1]);
576 radiationModel.B[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(b_size[0],b_size[1]);
577 radiationModel.C[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(c_size[0],c_size[1]);
578 radiationModel.D[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(d_size[0],d_size[1]);
580 for(
int k=0; k < a_size[0]; k++)
581 for(
int l=0; l < a_size[1]; l++)
583 assert(a_size[0]*a_size[1] > (l+k*a_size[1]) );
584 radiationModel.A[i][j](k,l) = A_tmp[k+l*a_size[0]];
586 for(
int k=0; k < b_size[0]; k++)
587 for(
int l=0; l < b_size[1]; l++)
589 assert(b_size[0]*b_size[1] > (l+k*b_size[1]) );
590 radiationModel.B[i][j](k,l) = B_tmp[k+l*b_size[0]];
593 for(
int k=0; k < c_size[0]; k++)
594 for(
int l=0; l < c_size[1]; l++)
596 assert(c_size[0]*c_size[1] > (l+k*c_size[1]) );
597 radiationModel.C[i][j](k,l) = C_tmp[k+l*c_size[0]];
599 for(
int k=0; k < d_size[0]; k++)
600 for(
int l=0; l < d_size[1]; l++)
602 assert(d_size[0]*d_size[1] > (l+k*d_size[1]) );
603 radiationModel.D[i][j](k,l) = D_tmp[k+l*d_size[0]];
608 cache.read(
reinterpret_cast<char*
>(Ainf_tmp),
sizeof(double)*6*6);
610 for(
int i=0; i < 6; i++)
611 for(
int j=0; j < 6; j++)
612 radiationModel.Ainf(i,j)=Ainf_tmp[j+i*6];
614 radiationModel.Speed = 0;
615 RadiationApproximation.insert( std::make_pair(0,radiationModel) );
620 void IdentificaitonToCache()
622 std::string cachebase = fname;
623 std::stringstream ss; ss << cachebase <<
".identcache1";
625 std::fstream cache(ss.str().c_str(),std::ios::out|std::ios::binary);
632 cache.write(
reinterpret_cast<char*
>(&NoSpeed),
sizeof(
unsigned int) );
634 for(
unsigned int SpeedIdx=0; SpeedIdx < NoSpeed; SpeedIdx++)
636 double MySpeed = Speed[SpeedIdx];
638 cache.write(
reinterpret_cast<char*
>(&MySpeed),
sizeof(
double) );
639 for(
int i=0; i < 6; i++)
641 for(
int j=0; j < 6; j++)
646 a_size[0] =
static_cast<int>(RadiationApproximation[SpeedIdx].A[i][j].rows());
647 a_size[1] =
static_cast<int>(RadiationApproximation[SpeedIdx].A[i][j].cols());
649 cache.write(
reinterpret_cast<char*
>(a_size),
sizeof(a_size) );
650 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[SpeedIdx].A[i][j].data()),
sizeof(
double)*a_size[0]*a_size[1] );
655 b_size[0] =
static_cast<int>(RadiationApproximation[SpeedIdx].B[i][j].rows());
656 b_size[1] =
static_cast<int>(RadiationApproximation[SpeedIdx].B[i][j].cols());
658 cache.write(
reinterpret_cast<char*
>(b_size),
sizeof(b_size) );
659 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[SpeedIdx].B[i][j].data()),
sizeof(
double)*b_size[0]*b_size[1] );
664 c_size[0] =
static_cast<int>(RadiationApproximation[SpeedIdx].C[i][j].rows());
665 c_size[1] =
static_cast<int>(RadiationApproximation[SpeedIdx].C[i][j].cols());
667 cache.write(
reinterpret_cast<char*
>(c_size),
sizeof(c_size) );
668 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[SpeedIdx].C[i][j].data()),
sizeof(
double)*c_size[0]*c_size[1] );
673 d_size[0] =
static_cast<int>(RadiationApproximation[SpeedIdx].D[i][j].rows());
674 d_size[1] =
static_cast<int>(RadiationApproximation[SpeedIdx].D[i][j].cols());
676 cache.write(
reinterpret_cast<char*
>(d_size),
sizeof(d_size) );
677 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[SpeedIdx].D[i][j].data()),
sizeof(
double)*d_size[0]*d_size[1] );
682 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[SpeedIdx].Ainf.data()),
sizeof(
double)*6*6 );
687 bool IdentificationFromCache()
689 std::string cachebase = fname;
690 std::stringstream ss; ss << cachebase <<
".identcache1";
691 std::fstream cache(ss.str().c_str(),std::ios::in|std::ios::binary);
692 if( !cache.good() )
return false;
699 double Ainf_tmp[6*6];
701 cache.read(
reinterpret_cast<char*
>(&NoSpeed),
sizeof(
unsigned int) );
703 for(
unsigned int SpeedIdx=0; SpeedIdx < NoSpeed; SpeedIdx++)
707 cache.read(
reinterpret_cast<char*
>(&MySpeed),
sizeof(
double) );
709 TimeDomainRadiation radiationModel;
710 for(
int i=0; i < 6; i++)
712 for(
int j=0; j < 6; j++)
714 cache.read(
reinterpret_cast<char*
>(a_size),
sizeof(a_size) );
715 std::vector<double> A_tmp( a_size[0]*a_size[1] );
717 cache.read(
reinterpret_cast<char*
>(A_tmp.data()),
sizeof(
double)*a_size[0]*a_size[1] );
719 cache.read(
reinterpret_cast<char*
>(b_size),
sizeof(b_size) );
720 std::vector<double> B_tmp( b_size[0]*b_size[1] );
722 cache.read(
reinterpret_cast<char*
>(B_tmp.data()),
sizeof(
double)*b_size[0]*b_size[1] );
724 cache.read(
reinterpret_cast<char*
>(c_size),
sizeof(c_size) );
725 std::vector<double> C_tmp( c_size[0]*c_size[1] );
727 cache.read(
reinterpret_cast<char*
>(C_tmp.data()),
sizeof(
double)*c_size[0]*c_size[1] );
729 cache.read(
reinterpret_cast<char*
>(d_size),
sizeof(d_size) );
730 std::vector<double> D_tmp( d_size[0]*d_size[1] );
732 cache.read(
reinterpret_cast<char*
>(D_tmp.data()),
sizeof(
double)*d_size[0]*d_size[1] );
735 radiationModel.A[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(a_size[0],a_size[1]);
736 radiationModel.B[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(b_size[0],b_size[1]);
737 radiationModel.C[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(c_size[0],c_size[1]);
738 radiationModel.D[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(d_size[0],d_size[1]);
740 for(
int k=0; k < a_size[0]; k++)
741 for(
int l=0; l < a_size[1]; l++)
743 assert(a_size[0]*a_size[1] > (l+k*a_size[1]) );
744 radiationModel.A[i][j](k,l) = A_tmp[k+l*a_size[0]];
746 for(
int k=0; k < b_size[0]; k++)
747 for(
int l=0; l < b_size[1]; l++)
749 assert(b_size[0]*b_size[1] > (l+k*b_size[1]) );
750 radiationModel.B[i][j](k,l) = B_tmp[k+l*b_size[0]];
753 for(
int k=0; k < c_size[0]; k++)
754 for(
int l=0; l < c_size[1]; l++)
756 assert(c_size[0]*c_size[1] > (l+k*c_size[1]) );
757 radiationModel.C[i][j](k,l) = C_tmp[k+l*c_size[0]];
759 for(
int k=0; k < d_size[0]; k++)
760 for(
int l=0; l < d_size[1]; l++)
762 assert(d_size[0]*d_size[1] > (l+k*d_size[1]) );
763 radiationModel.D[i][j](k,l) = D_tmp[k+l*d_size[0]];
768 cache.read(
reinterpret_cast<char*
>(Ainf_tmp),
sizeof(double)*6*6);
770 for(
int i=0; i < 6; i++)
771 for(
int j=0; j < 6; j++)
772 radiationModel.Ainf(i,j)=Ainf_tmp[j+i*6];
774 radiationModel.Speed = MySpeed;
775 RadiationApproximation.insert( std::make_pair(SpeedIdx, radiationModel ));
782 void RadiationDerivative(
int DOF1,
int DOF2,
double *derivative,
const double *
const radiation_state,
const double *ship_state,
unsigned int SpeedNo=0 )
784 const TimeDomainRadiation& radiationModel = RadiationApproximation[SpeedNo];
786 const size_t state_size = radiationModel.A[DOF1][DOF2].cols();
787 Eigen::Map<const Eigen::MatrixXd,Eigen::Unaligned> X(radiation_state,state_size,1);
788 Eigen::Map<Eigen::MatrixXd,Eigen::Unaligned> dotX(derivative,state_size,1);
789 dotX.noalias() = radiationModel.A[DOF1][DOF2]*X + radiationModel.B[DOF1][DOF2]*ship_state[DOF2];
792 double RadiationOutput(
int DOF1,
int DOF2,
const double *
const radiation_state,
const double *
const ship_state,
unsigned int SpeedNo=0)
794 const TimeDomainRadiation& radiationModel = RadiationApproximation[SpeedNo];
796 const size_t state_size = radiationModel.A[DOF1][DOF2].cols();
797 Eigen::Map<const Eigen::MatrixXd,Eigen::Unaligned> X(radiation_state,state_size,1);
798 return (radiationModel.C[DOF1][DOF2]*X + radiationModel.D[DOF1][DOF2]*ship_state[DOF2]).value();
802 std::map<int,TimeDomainRadiation,std::less<int>,Eigen::aligned_allocator<std::pair<const int,TimeDomainRadiation> > > RadiationApproximation;
806 virtual bool is2Ddata(){
812 std::vector<std::string> m_warnings;
815 double Lpp = std::numeric_limits<double>::quiet_NaN(), Bredth = std::numeric_limits<double>::quiet_NaN(), Draught = std::numeric_limits<double>::quiet_NaN();
817 double LCG = std::numeric_limits<double>::quiet_NaN(), VCG = std::numeric_limits<double>::quiet_NaN();
818 double LCB = std::numeric_limits<double>::quiet_NaN(), VCB = std::numeric_limits<double>::quiet_NaN();
821 unsigned int NoSpeed = 0;
822 unsigned int NoHeading;
824 unsigned int NoFrequency;
826 std::vector<double> Speed;
827 std::vector<double> Heading;
830 std::unique_ptr<FroudeKrylovForce> FroudeFrylov;
831 std::unique_ptr<WaveDriftForce> WaveDrift;
833 Eigen::Matrix<double,6,6> Mrbeig;
834 std::vector<std::vector<Eigen::Matrix<double,6,6> > > A;
835 std::vector<std::vector<Eigen::Matrix<double,6,6> > > B;
836 std::vector<std::vector<Eigen::Matrix<double,6,6> > > C;
837 std::vector<std::vector<Eigen::Matrix<double,6,6> > > Aadd;
838 std::vector<std::vector<Eigen::Matrix<double,6,6> > > Badd;
839 std::vector<std::vector<Eigen::Matrix<double,6,6> > > Cadd;
841 Eigen::Matrix<double,3,1> rg;
842 Eigen::Matrix<double,3,1> ro;
843 std::map<std::string,double> param;