|
[Sponsors] |
Damper in aeroelastic NACA64A010 SU2 testcase: need to access the source code? |
|
LinkBack | Thread Tools | Search this Thread | Display Modes |
October 21, 2020, 14:35 |
Damper in aeroelastic NACA64A010 SU2 testcase: need to access the source code?
|
#1 |
New Member
Kevin Wittkowski
Join Date: Sep 2020
Posts: 14
Rep Power: 6 |
Hello everybody,
I'm trying to run an aeroelastic simulation of a NACA64A010 in SU2: the configuration files can be found here https://github.com/su2code/SU2/tree/...es/aeroelastic (as I was suggested in a previous post). My problem is that I want the translation and rotation of the airfoil to be mechanically damped like in the system in figure (taken from https://su2code.github.io/documents/su2_dev_sanchez.pdf) but there are no settings in the configuration file options to set the translational and rotational mechanical damping (see https://github.com/precice/su2-adapt..._structure.cpp under "/*!\par CONFIG_CATEGORY: Aeroelastic Simulation (Typical Section Model) \ingroup Config*/") So in the document by Sanchez actually there is an airfoil-spring-damper system examined with SU2 but there seems to be no configuration setting to specify the mechanical damping. Then in the file "PitchPlungeAirfoilStructuralTester.py" in SU2 installation files there seems to be the possibility of damping the structure... Thus, how should I proceed? Should I build the code from source and touch the equations directly (how?) or is there a simpler way? Thanks beforehand. |
|
October 23, 2020, 08:03 |
|
#2 |
Senior Member
Pedro Gomes
Join Date: Dec 2017
Posts: 466
Rep Power: 14 |
Hello Kevin,
The function you would need to modify is "CSolver::SolveTypicalSectionWingModel" in file CSolver.cpp around line 2900, in version 7.0.7. Indeed you would have to recompile the code (I'm told that is not very simple on Windows). |
|
October 26, 2020, 07:32 |
|
#3 |
New Member
Kevin Wittkowski
Join Date: Sep 2020
Posts: 14
Rep Power: 6 |
Thank you so much Pedro, I will devote next week to building that from source and recompile the code. I will let you know.
|
|
November 11, 2020, 04:23 |
|
#4 | |
New Member
Kevin Wittkowski
Join Date: Sep 2020
Posts: 14
Rep Power: 6 |
Quote:
this is the code in CSolver.cpp near line 2900. I think the part I should modify to take into account the damping would be in "Phi" and "Omega2". However, I don't know 1)why the stiffness matrix is commented 2)how the problem is being solved: is the problem first diagonalized and then solved in decoupled form? Or is it something else? Thanks in advance Code:
void CSolver::SetUpTypicalSectionWingModel(vector<vector<su2double> >& Phi, vector<su2double>& omega, CConfig *config) { /*--- Retrieve values from the config file ---*/ su2double w_h = config->GetAeroelastic_Frequency_Plunge(); su2double w_a = config->GetAeroelastic_Frequency_Pitch(); su2double x_a = config->GetAeroelastic_CG_Location(); su2double r_a = sqrt(config->GetAeroelastic_Radius_Gyration_Squared()); su2double w = w_h/w_a; // Mass Matrix vector<vector<su2double> > M(2,vector<su2double>(2,0.0)); M[0][0] = 1; M[0][1] = x_a; M[1][0] = x_a; M[1][1] = r_a*r_a; // Stiffness Matrix // vector<vector<su2double> > K(2,vector<su2double>(2,0.0)); // K[0][0] = (w_h/w_a)*(w_h/w_a); // K[0][1] = 0.0; // K[1][0] = 0.0; // K[1][1] = r_a*r_a; /* Eigenvector and Eigenvalue Matrices of the Generalized EigenValue Problem. */ vector<vector<su2double> > Omega2(2,vector<su2double>(2,0.0)); su2double aux; // auxiliary variable aux = sqrt(pow(r_a,2)*pow(w,4) - 2*pow(r_a,2)*pow(w,2) + pow(r_a,2) + 4*pow(x_a,2)*pow(w,2)); Phi[0][0] = (r_a * (r_a - r_a*pow(w,2) + aux)) / (2*x_a*pow(w, 2)); Phi[0][1] = (r_a * (r_a - r_a*pow(w,2) - aux)) / (2*x_a*pow(w, 2)); Phi[1][0] = 1.0; Phi[1][1] = 1.0; Omega2[0][0] = (r_a * (r_a + r_a*pow(w,2) - aux)) / (2*(pow(r_a, 2) - pow(x_a, 2))); Omega2[0][1] = 0; Omega2[1][0] = 0; Omega2[1][1] = (r_a * (r_a + r_a*pow(w,2) + aux)) / (2*(pow(r_a, 2) - pow(x_a, 2))); /* Nondimesionalize the Eigenvectors such that Phi'*M*Phi = I and PHI'*K*PHI = Omega */ // Phi'*M*Phi = D // D^(-1/2)*Phi'*M*Phi*D^(-1/2) = D^(-1/2)*D^(1/2)*D^(1/2)*D^(-1/2) = I, D^(-1/2) = inv(sqrt(D)) // Phi = Phi*D^(-1/2) vector<vector<su2double> > Aux(2,vector<su2double>(2,0.0)); vector<vector<su2double> > D(2,vector<su2double>(2,0.0)); // Aux = M*Phi for (int i=0; i<2; i++) { for (int j=0; j<2; j++) { Aux[i][j] = 0; for (int k=0; k<2; k++) { Aux[i][j] += M[i][k]*Phi[k][j]; } } } // D = Phi'*Aux for (int i=0; i<2; i++) { for (int j=0; j<2; j++) { D[i][j] = 0; for (int k=0; k<2; k++) { D[i][j] += Phi[k][i]*Aux[k][j]; //PHI transpose } } } //Modify the first column Phi[0][0] = Phi[0][0] * 1/sqrt(D[0][0]); Phi[1][0] = Phi[1][0] * 1/sqrt(D[0][0]); //Modify the second column Phi[0][1] = Phi[0][1] * 1/sqrt(D[1][1]); Phi[1][1] = Phi[1][1] * 1/sqrt(D[1][1]); // Sqrt of the eigenvalues (frequency of vibration of the modes) omega[0] = sqrt(Omega2[0][0]); omega[1] = sqrt(Omega2[1][1]); } void CSolver::SolveTypicalSectionWingModel(CGeometry *geometry, su2double Cl, su2double Cm, CConfig *config, unsigned short iMarker, vector<su2double>& displacements) { /*--- The aeroelastic model solved in this routine is the typical section wing model The details of the implementation are similar to those found in J.J. Alonso "Fully-Implicit Time-Marching Aeroelastic Solutions" 1994. ---*/ /*--- Retrieve values from the config file ---*/ su2double w_alpha = config->GetAeroelastic_Frequency_Pitch(); su2double vf = config->GetAeroelastic_Flutter_Speed_Index(); su2double b = config->GetLength_Reynolds()/2.0; // airfoil semichord, Reynolds length is by defaul 1.0 su2double dt = config->GetDelta_UnstTimeND(); dt = dt*w_alpha; //Non-dimensionalize the structural time. /*--- Structural Equation damping ---*/ vector<su2double> xi(2,0.0); /*--- Eigenvectors and Eigenvalues of the Generalized EigenValue Problem. ---*/ vector<vector<su2double> > Phi(2,vector<su2double>(2,0.0)); // generalized eigenvectors. vector<su2double> w(2,0.0); // sqrt of the generalized eigenvalues (frequency of vibration of the modes). SetUpTypicalSectionWingModel(Phi, w, config); /*--- Solving the Decoupled Aeroelastic Problem with second order time discretization Eq (9) ---*/ /*--- Solution variables description. //x[j][i], j-entry, i-equation. // Time (n+1)->np1, n->n, (n-1)->n1 ---*/ vector<vector<su2double> > x_np1(2,vector<su2double>(2,0.0)); /*--- Values from previous movement of spring at true time step n+1 We use this values because we are solving for delta changes not absolute changes ---*/ vector<vector<su2double> > x_np1_old = config->GetAeroelastic_np1(iMarker); /*--- Values at previous timesteps. ---*/ vector<vector<su2double> > x_n = config->GetAeroelastic_n(iMarker); vector<vector<su2double> > x_n1 = config->GetAeroelastic_n1(iMarker); /*--- Set up of variables used to solve the structural problem. ---*/ vector<su2double> f_tilde(2,0.0); vector<vector<su2double> > A_inv(2,vector<su2double>(2,0.0)); su2double detA; su2double s1, s2; vector<su2double> rhs(2,0.0); //right hand side vector<su2double> eta(2,0.0); vector<su2double> eta_dot(2,0.0); /*--- Forcing Term ---*/ su2double cons = vf*vf/PI_NUMBER; vector<su2double> f(2,0.0); f[0] = cons*(-Cl); f[1] = cons*(2*-Cm); //f_tilde = Phi'*f for (int i=0; i<2; i++) { f_tilde[i] = 0; for (int k=0; k<2; k++) { f_tilde[i] += Phi[k][i]*f[k]; //PHI transpose } } /*--- solve each decoupled equation (The inverse of the 2x2 matrix is provided) ---*/ for (int i=0; i<2; i++) { /* Matrix Inverse */ detA = 9.0/(4.0*dt*dt) + 3*w[i]*xi[i]/(dt) + w[i]*w[i]; A_inv[0][0] = 1/detA * (3/(2.0*dt) + 2*xi[i]*w[i]); A_inv[0][1] = 1/detA * 1; A_inv[1][0] = 1/detA * -w[i]*w[i]; A_inv[1][1] = 1/detA * 3/(2.0*dt); /* Source Terms from previous iterations */ s1 = (-4*x_n[0][i] + x_n1[0][i])/(2.0*dt); s2 = (-4*x_n[1][i] + x_n1[1][i])/(2.0*dt); /* Problem Right Hand Side */ rhs[0] = -s1; rhs[1] = f_tilde[i]-s2; /* Solve the equations */ x_np1[0][i] = A_inv[0][0]*rhs[0] + A_inv[0][1]*rhs[1]; x_np1[1][i] = A_inv[1][0]*rhs[0] + A_inv[1][1]*rhs[1]; eta[i] = x_np1[0][i]-x_np1_old[0][i]; // For displacements, the change(deltas) is used. eta_dot[i] = x_np1[1][i]; // For velocities, absolute values are used. } /*--- Transform back from the generalized coordinates to get the actual displacements in plunge and pitch q = Phi*eta ---*/ vector<su2double> q(2,0.0); vector<su2double> q_dot(2,0.0); for (int i=0; i<2; i++) { q[i] = 0; q_dot[i] = 0; for (int k=0; k<2; k++) { q[i] += Phi[i][k]*eta[k]; q_dot[i] += Phi[i][k]*eta_dot[k]; } } su2double dh = b*q[0]; su2double dalpha = q[1]; su2double h_dot = w_alpha*b*q_dot[0]; //The w_a brings it back to actual time. su2double alpha_dot = w_alpha*q_dot[1]; /*--- Set the solution of the structural equations ---*/ displacements[0] = dh; displacements[1] = dalpha; displacements[2] = h_dot; displacements[3] = alpha_dot; /*--- Calculate the total plunge and total pitch displacements for the unsteady step by summing the displacement at each sudo time step ---*/ su2double pitch, plunge; pitch = config->GetAeroelastic_pitch(iMarker); plunge = config->GetAeroelastic_plunge(iMarker); config->SetAeroelastic_pitch(iMarker , pitch+dalpha); config->SetAeroelastic_plunge(iMarker , plunge+dh/b); /*--- Set the Aeroelastic solution at time n+1. This gets update every sudo time step and after convering the sudo time step the solution at n+1 get moved to the solution at n in SetDualTime_Solver method ---*/ config->SetAeroelastic_np1(iMarker, x_np1); } |
||
Tags |
aeroelastic, damper, pitching plunging airfoil, rigidbody, structural |
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
[OpenFOAM.com] swak4foam compiling issues on a cluster | saj216 | OpenFOAM Installation | 5 | January 17, 2023 17:05 |
[swak4Foam] Installation Problem with OF 6 version | Aurel | OpenFOAM Community Contributions | 14 | November 18, 2020 17:18 |
Trouble compiling utilities using source-built OpenFOAM | Artur | OpenFOAM Programming & Development | 14 | October 29, 2013 11:59 |
centOS 5.6 : paraFoam not working | yossi | OpenFOAM Installation | 2 | October 9, 2013 02:41 |
friction forces icoFoam | ofslcm | OpenFOAM | 3 | April 7, 2012 11:57 |