gismo调试-组总刚

news2025/2/12 1:14:59

文章目录


前言

只是为方便学习,不做其他用途,

一、

1 组总刚main文件的断点

    //=============================================//
			  // Assembling & solving //
	//=============================================//

	// creating assembler
	gsElasticityAssembler<real_t> assembler(geometry, basis, bcInfo, g);
	assembler.options().setReal("YoungsModulus", youngsModulus);
	assembler.options().setReal("PoissonsRatio", poissonsRatio);
	gsInfo << "Assembling...\n";
	gsStopwatch clock;
	clock.restart();
	assembler.assemble();

在这里插入图片描述

2 跳转到gsElasticityAssembler.hpp

147行:gsElasticityAssembler::assemble(bool saveEliminationMatrix)函数

//--------------------- SYSTEM ASSEMBLY ----------------------------------//

template<class T>
void gsElasticityAssembler<T>::assemble(bool saveEliminationMatrix)
{
    m_system.matrix().setZero();
    reserve();
    m_system.rhs().setZero();

    // Compute volumetric integrals and write to the global linear system计算体积积分并写入全局线性系统
    if (m_bases.size() == unsigned(m_dim)) // displacement formulation
    {
        GISMO_ENSURE(m_options.getInt("MaterialLaw") == material_law::hooke,
                     "Material law not specified OR not supported! Material law = "<<m_options.getInt("MaterialLaw"));
        if (saveEliminationMatrix)
        {
            eliminationMatrix.resize(Base::numDofs(),Base::numFixedDofs());
            eliminationMatrix.setZero();
            eliminationMatrix.reservePerColumn(m_system.numColNz(m_bases[0],m_options));
        }

        // if !composite

        // else


        if (m_materialMat!=NULL)
        {
            gsVisitorLinearElasticityMM<T> visitor(*m_pde_ptr,m_materialMat, saveEliminationMatrix ? &eliminationMatrix : nullptr);
            Base::template push<gsVisitorLinearElasticityMM<T> >(visitor);
        }
        else
        {
            gsVisitorLinearElasticity<T> visitor(*m_pde_ptr, saveEliminationMatrix ? &eliminationMatrix : nullptr);
            Base::template push<gsVisitorLinearElasticity<T> >(visitor);
        }

        if (saveEliminationMatrix)
        {
            Base::rhsWithZeroDDofs = m_system.rhs();
            eliminationMatrix.makeCompressed();
        }

    }
    else // mixed formulation (displacement + pressure)
    {
        GISMO_ENSURE(m_options.getInt("MaterialLaw") == material_law::mixed_hooke,
                     "Material law not specified OR not supported!");
        gsVisitorMixedLinearElasticity<T> visitor(*m_pde_ptr);
        Base::template push<gsVisitorMixedLinearElasticity<T> >(visitor);
    }

    // Compute surface integrals and write to the global rhs vector
    Base::template push<gsVisitorElasticityNeumann<T> >(m_pde_ptr->bc().neumannSides());

    m_system.matrix().makeCompressed();
}

在这里插入图片描述

3 gsElasticityAssembler.hpp的177行进入gsVisitorLinearElasticity.h

在这里插入图片描述

在这里插入图片描述

inline void assemble(gsDomainIterator<T> & element,
                         const gsVector<T> & quWeights)
    {
        // initialize local matrix and rhs
        localMat.setZero(dim*N_D,dim*N_D);
        localRhs.setZero(dim*N_D,1);
        // Loop over the quadrature nodes
        for (index_t q = 0; q < quWeights.rows(); ++q)
        {
            // Multiply quadrature weight by the geometry measure
            const T weightForce = quWeights[q] * md.measure(q);
            const T weightBody = quWeights[q] * pow(md.measure(q),1-localStiffening);
            // Compute physical gradients of basis functions at q as a dim x numActiveFunction matrix
            transformGradients(md,q,basisValuesDisp[1],physGrad);
            // loop over active basis functions (v_j)
            for (index_t i = 0; i < N_D; i++)
            {
                // stiffness matrix K = B_i^T * C * B_j;
                setB<T>(B_i,I,physGrad.col(i));
                tempK = B_i.transpose() * C; //.reshapeCol(q,dim,dim)
                // loop over active basis functions (v_j)
                for (index_t j = 0; j < N_D; j++)
                {
                    setB<T>(B_j,I,physGrad.col(j));
                    K = tempK * B_j;
                    for (short_t di = 0; di < dim; ++di)
                        for (short_t dj = 0; dj < dim; ++dj)
                            localMat(di*N_D+i,dj*N_D+j) += weightBody * K(di,dj);
                }
            }
            // rhs contribution
            for (short_t d = 0; d < dim; ++d)
                localRhs.middleRows(d*N_D,N_D).noalias() += weightForce * forceScaling * forceValues(d,q) * basisValuesDisp[0].col(q) ;
        }
    }

4 进入gsAssembler.h

在这里插入图片描述

gsVisitorLinearElasticity.h的119行结束进入gsAssembler.h

在这里插入图片描述

template <class T>
template<class ElementVisitor>
void gsAssembler<T>::apply(ElementVisitor & visitor,
                           size_t patchIndex,
                           boxSide side)
{
    //gsDebug<< "Apply to patch "<< patchIndex <<"("<< side <<")\n";

    const gsBasisRefs<T> bases(m_bases, patchIndex);

#pragma omp parallel
{
    gsQuadRule<T> quRule ; // Quadrature rule
    gsMatrix<T> quNodes  ; // Temp variable for mapped nodes
    gsVector<T> quWeights; // Temp variable for mapped weights

    ElementVisitor
#ifdef _OPENMP
    // Create thread-private visitor
    visitor_(visitor);
    const int tid = omp_get_thread_num();
    const int nt  = omp_get_num_threads();
#else
    &visitor_ = visitor;
#endif

    // Initialize reference quadrature rule and visitor data
    visitor_.initialize(bases, patchIndex, m_options, quRule);

    const gsGeometry<T> & patch = m_pde_ptr->patches()[patchIndex];

    // Initialize domain element iterator -- using unknown 0
    typename gsBasis<T>::domainIter domIt = bases[0].makeDomainIterator(side);

    // Start iteration over elements
#ifdef _OPENMP
    for ( domIt->next(tid); domIt->good(); domIt->next(nt) )
#else
    for (; domIt->good(); domIt->next() )
#endif
    {
        // Map the Quadrature rule to the element
        quRule.mapTo( domIt->lowerCorner(), domIt->upperCorner(), quNodes, quWeights );

        // Perform required evaluations on the quadrature nodes
        visitor_.evaluate(bases, patch, quNodes);

        // Assemble on element
        visitor_.assemble(*domIt, quWeights);

        // Push to global matrix and right-hand side vector
#pragma omp critical(localToGlobal)
        visitor_.localToGlobal(patchIndex, m_ddof, m_system); // omp_locks inside
    }
}//omp parallel

}

重新进入gsVisitorLinearElasticity.h

进入函数:inline void localToGlobal

在这里插入图片描述

PushToMatrix 推出一个局部矩阵,该矩阵由若干块组成,这些块对应于全局系统的各个块

进入gsSparseSystem.h

进入gsSparseSystem.h函数816行:void pushToMatrix

在这里插入图片描述

/**
     * @brief pushToMatrix pushes one local matrix consisting of several blocks corresponding to blocks of the global system
     * \note
     * 1. Usefull for bilinear forms depending on vector valued functions
     * 2. different index sets are used for row and column blocks
     * 3. eliminated dofs are incorporated in the right way
     * 4. assume identical row and column mappers for the global system, therefore only one vector of mapped index sets is given
     * @param[in] localMat local system matrix
     * @param[in] actives_vec a vector of mapped index sets (for ALL blocks of the global system), accessed via \a actives_vec[\a r_vec(i)]
     * @param[in] eliminatedDofs a vector of values for the dofs (corresponding to the columns) that are eliminated from the system
     *            (for ALL blocks of the global system), accessed via \a eliminatedDofs[\a r_vec(i)]
     * @param[in] r_vec a vector of row block indices to which the local matrix is pushed
     * @param[in] c_vec a vector of column block indices to which the local matrix is pushed
     */
    void pushToMatrix(const gsMatrix<T> & localMat,
                      const std::vector<gsMatrix<index_t> >& actives_vec,
                      const std::vector<gsMatrix<T> > & eliminatedDofs,
                      const gsVector<index_t> & r_vec,
                      const gsVector<index_t> & c_vec)
    {
        int rstrLocal = 0;
        int cstrLocal = 0;

        for (index_t r_ind = 0; r_ind != r_vec.size(); ++r_ind) // for row-blocks
        {
            size_t r = r_vec(r_ind);
            const gsDofMapper & rowMap    = m_mappers[m_row.at(r)];
            const index_t numActive_i = actives_vec[r].rows();

            for (index_t c_ind = 0; c_ind != c_vec.size(); ++c_ind) // for col-blocks
            {
                size_t c = c_vec(c_ind);
                const gsDofMapper & colMap    = m_mappers[m_col.at(c)];
                const index_t numActive_j = actives_vec[c].rows();
                const gsMatrix<T> & eliminatedDofs_j = eliminatedDofs[c];

                for (index_t i = 0; i != numActive_i; ++i) // N_i
                {
                    const int ii =  m_rstr.at(r) + actives_vec[r].at(i); // row index global matrix
                    const int iiLocal = rstrLocal + i;                   // row index local matrix

                    if ( rowMap.is_free_index(actives_vec[r].at(i)) )
                    {

                        for (index_t j = 0; j != numActive_j; ++j) // N_j
                        {
                            const int jj =  m_cstr.at(c) + actives_vec[c].at(j); // column index global matrix
                            const int jjLocal = cstrLocal + j;                   // column index local matrix

                            if ( colMap.is_free_index(actives_vec[c].at(j)) )
                            {
                                // If matrix is symmetric, we store only lower
                                // triangular part
                                if ( (!symm) || jj <= ii )
                                    m_matrix.coeffRef(ii, jj) += localMat(iiLocal, jjLocal);
                            }
                            else // Fixed DoF
                            {
                                m_rhs.row(ii).noalias() -= localMat(iiLocal, jjLocal) * eliminatedDofs_j.row( colMap.global_to_bindex(actives_vec[c].at(j)));
                            }
                        }
                    }
                }
                cstrLocal += numActive_j;
            }
            cstrLocal = 0;
            rstrLocal += numActive_i;
        }

    }

gsSparseSystem.h函数816行:void pushToMatrix结束后进入gsVisitorLinearElasticity.h 的函数inline void localToGlobal的135行

在这里插入图片描述
在这里插入图片描述

进入gsAssembler.h的718行
在这里插入图片描述

进入gsAssembler.h的455行函数
遍历域的所有单元并应用

    template<class ElementVisitor>
    void push(const ElementVisitor & visitor)

在这里插入图片描述

gsElasticityAssembler.hpp中 gsElasticityAssembler::assemble(bool saveEliminationMatrix) 函数运行完200行结束:

在这里插入图片描述

进入到主程序文件中:

在这里插入图片描述

gsElasticityAssembler.hpp

1.1

gsSparseSystem.h函数816行:void pushToMatrix结束后进入gsVisitorLinearElasticity.h 的函数inline void localToGlobal的135行

4 进入gsAssembler.h

1.2

1.3

1.4

二、

2.1

2.2

2.3

<f

2.4

代码

/// This is the 2D linear elasticity benchmark "Infinite plate with circular hole"
/// as described in V.P.Nguyen, C.Anitescu, S.P.A.Bordas, T.Rabczuk, 2015
/// "Isogeometric analysis: An overview and computer implementation aspects".
///
/// Author: A.Shamanskiy (2016 - ...., TU Kaiserslautern)
#include <gismo.h>
#include <gsElasticity/gsElasticityAssembler.h>
#include <gsElasticity/gsWriteParaviewMultiPhysics.h>

using namespace gismo;

int main(int argc, char* argv[]) {

	gsInfo << "This is the 2D linear elasticity benchmark: infinite plate with circular hole.\n";

	//=====================================//
				// Input //
	//=====================================//

	std::string filename = "plateWithHole.xml";
	index_t numUniRef = 0;
	index_t numDegElev = 0;
	index_t numPlotPoints = 10000;
	bool plotMesh = false;

	// minimalistic user interface for terminal
	gsCmdLine cmd("This is the 2D linear elasticity benchmark: infinite plate with circular hole.");
	cmd.addInt("r", "refine", "Number of uniform refinement application", numUniRef);
	cmd.addInt("d", "degelev", "Number of degree elevation application", numDegElev);
	cmd.addInt("p", "points", "Number of points to plot to Paraview", numPlotPoints);
	cmd.addSwitch("m", "mesh", "Plot computational mesh", plotMesh);
	try { cmd.getValues(argc, argv); }
	catch (int rv) { return rv; }

	//=============================================//
		// Scanning geometry and creating bases //
	//=============================================//

	// scanning geometry
	gsMultiPatch<> geometry;
	gsReadFile<>(filename, geometry);

	// creating basis
	gsMultiBasis<> basis(geometry);
	for (index_t i = 0; i < numDegElev; ++i)
		basis.degreeElevate();
	for (index_t i = 0; i < numUniRef; ++i)
		basis.uniformRefine();
	gsInfo << basis;
	//=============================================//
		// Setting loads and boundary conditions //
	//=============================================//

	gsFunctionExpr<> analyticalStresses("1-1/(x^2+y^2)*(3/2*cos(2*atan2(y,x)) + cos(4*atan2(y,x))) + 3/2/(x^2+y^2)^2*cos(4*atan2(y,x))",
		"-1/(x^2+y^2)*(1/2*cos(2*atan2(y,x)) - cos(4*atan2(y,x))) - 3/2/(x^2+y^2)^2*cos(4*atan2(y,x))",
		"-1/(x^2+y^2)*(1/2*sin(2*atan2(y,x)) + sin(4*atan2(y,x))) + 3/2/(x^2+y^2)^2*sin(4*atan2(y,x))", 2);
	// boundary load neumann BC
	gsFunctionExpr<> traction("(-1+1/(x^2+y^2)*(3/2*cos(2*atan2(y,x)) + cos(4*atan2(y,x))) - 3/2/(x^2+y^2)^2*cos(4*atan2(y,x))) * (x==-4) +"
		"(-1/(x^2+y^2)*(1/2*sin(2*atan2(y,x)) + sin(4*atan2(y,x))) + 3/2/(x^2+y^2)^2*sin(4*atan2(y,x))) * (y==4)",
		"(1/(x^2+y^2)*(1/2*sin(2*atan2(y,x)) + sin(4*atan2(y,x))) - 3/2/(x^2+y^2)^2*sin(4*atan2(y,x))) * (x==-4) +"
		"(-1/(x^2+y^2)*(1/2*cos(2*atan2(y,x)) - cos(4*atan2(y,x))) - 3/2/(x^2+y^2)^2*cos(4*atan2(y,x))) * (y==4)", 2);
	// material parameters
	real_t youngsModulus = 1.0e3;
	real_t poissonsRatio = 0.3;

	// boundary conditions
	gsBoundaryConditions<> bcInfo;
	bcInfo.addCondition(0, boundary::north, condition_type::neumann, &traction);
	bcInfo.addCondition(0, boundary::west, condition_type::dirichlet, nullptr, 1); // last number is a component (coordinate) number
	bcInfo.addCondition(0, boundary::east, condition_type::dirichlet, nullptr, 0);

	// source function, rhs
	gsConstantFunction<> g(0., 0., 2);

	//=============================================//
			  // Assembling & solving //
	//=============================================//

	// creating assembler
	gsElasticityAssembler<real_t> assembler(geometry, basis, bcInfo, g);
	assembler.options().setReal("YoungsModulus", youngsModulus);
	assembler.options().setReal("PoissonsRatio", poissonsRatio);
	gsInfo << "Assembling...\n";
	gsStopwatch clock;
	clock.restart();
	assembler.assemble();
	gsInfo << "Assembled a system (matrix and load vector) with "
		<< assembler.numDofs() << " dofs in " << clock.stop() << "s.\n";

	gsInfo << "Solving...\n";
	clock.restart();

#ifdef GISMO_WITH_PARDISO
	gsSparseSolver<>::PardisoLLT solver(assembler.matrix());
	gsVector<> solVector = solver.solve(assembler.rhs());
	gsInfo << "Solved the system with PardisoLDLT solver in " << clock.stop() << "s.\n";
#else
	gsSparseSolver<>::SimplicialLDLT solver(assembler.matrix());
	gsVector<> solVector = solver.solve(assembler.rhs());
	gsInfo << "Solved the system with EigenLDLT solver in " << clock.stop() << "s.\n";
#endif

	//=============================================//
					  // Output //
	//=============================================//

	// constructing displacement as an IGA function
	gsMultiPatch<> solution;
	assembler.constructSolution(solVector, assembler.allFixedDofs(), solution);
	// constructing stress tensor
	gsPiecewiseFunction<> stresses;
	assembler.constructCauchyStresses(solution, stresses, stress_components::all_2D_vector);

	if (numPlotPoints > 0)
	{
		// constructing an IGA field (geometry + solution) for displacement
		gsField<> solutionField(assembler.patches(), solution);
		// constructing an IGA field (geometry + solution) for stresses
		gsField<> stressField(assembler.patches(), stresses, true);
		// analytical stresses
		gsField<> analyticalStressField(assembler.patches(), analyticalStresses, false);
		// creating a container to plot all fields to one Paraview file
		std::map<std::string, const gsField<> *> fields;
		fields["Deformation"] = &solutionField;
		fields["Stress"] = &stressField;
		fields["StressAnalytical"] = &analyticalStressField;
		gsWriteParaviewMultiPhysics(fields, "plateWithHole", numPlotPoints, plotMesh);
		gsInfo << "Open \"plateWithHole.pvd\" in Paraview for visualization. Stress wiggles on the left side are caused by "
			"a singularity in the parametrization.\n";
	}

	// eval stress at the top of the circular cut
	gsMatrix<> A(2, 1);
	A << 1., 0.; // parametric coordinates for the isogeometric solution
	gsMatrix<> res;
	stresses.piece(0).eval_into(A, res);
	A << 0., 1.; // spatial coordinates for the analytical solution
	gsMatrix<> analytical;
	analyticalStresses.eval_into(A, analytical);
	gsInfo << "XX-stress at the top of the circle: " << res.at(0) << " (computed), " << analytical.at(0) << " (analytical)\n";
	gsInfo << "YY-stress at the top of the circle: " << res.at(1) << " (computed), " << analytical.at(1) << " (analytical)\n";
	gsInfo << "XY-stress at the top of the circle: " << res.at(2) << " (computed), " << analytical.at(2) << " (analytical)\n";


	return 0;
}

总结 #pic_center

空格         空格

二维数
1
1
1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/640156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cracking C++(11): CMake代码高亮调研

文章目录 1. 目的2. VSCode 插件CMake 和 CMake ToolsCMake Language SupportCMake Highlights 3. JetBrains 系列3.1 CLion3.2 Fleet 4. Kate5. Sublime Text6. 总结 1. 目的 CMake 已经是开源 C 项目的主流 building system&#xff0c; 这里简单调研关注的编辑器 / IDE 下&…

Jetson nano 进阶教程4_通过IIC输出PWM

Jetson nano 进阶教程4_通过IIC输出PWM Jetson nano的40PIN不能直接发出PWM波&#xff0c;在很多控制舵机&#xff0c;电机调速方面很不方便&#xff0c;因此利用一块PCA9685模块&#xff0c;通过I2C总线控制PCA9685输出pwm波&#xff0c;并且可以调整占空比。 How do I use P…

Android Activity启动过程详解

目录 一&#xff0c;背景介绍 二&#xff0c;Activity启动过程 2.1 调用 ATMS 系统进程 2.1.1 时序图 2.1.2 Launcher 桌面的 App 图标入口 2.1.3 startActivitySafely() 方法 2.1.4 execStartActivity() 方法 2.2 ATMS 向 AMS 发送创建应用进程的过程 2.2.1 时序图 …

03- 流程控制(C语言)

一 概述 C语言支持三种程序运行结构&#xff1a;顺序结构、选择结构、循环结构。 顺序结构&#xff1a;按照语句编写的顺序 上到下逐句执行。选择结构&#xff1a;也叫 分支结构&#xff0c;依据是否满足条件&#xff0c;有选择的执行相应功能。循环结构&#xff1a;依据条件…

动态字符串SDS

基本概括 Redis中保存的Key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 但Redis没有直接使用C语言中的字符串&#xff0c;因为C语言字符串存在很多问题&#xff08;C语言中实际上没有字符串&#xff0c;本质上是字符数…

面向对象的封装

9. 面向对象特征一&#xff1a;封装性(encapsulation) 什么是封装 就像快递一样我们在网上买的物品&#xff0c;快递都会给我们添加外包装&#xff0c;给我们封装起来&#xff0c;这就是封装 客观世界里每一个事物的内部信息都隐藏在其内部&#xff0c;外界无法直接操作和修改…

怎样才算一个计算机知识体系完整的毕业生

为什么突然想写这个话题呢&#xff1f; 最近有不少新关注的读者&#xff0c;在后台问&#xff1a;大学学 Java 和 C 哪个好找工作&#xff0c;学前端好还是后端好&#xff0c;该学 Vue 还是 React。。。 仿佛看到了自己当年的模样&#xff0c;所以觉得有必要单独写一篇文章&a…

CSS基础学习--8 盒子模型(Box Model)

一、介绍 所有HTML元素可以看作盒子&#xff0c;在CSS中&#xff0c;"box model"这一术语是用来设计和布局时使用。 CSS盒模型本质上是一个盒子&#xff0c;封装周围的HTML元素&#xff0c;它包括&#xff1a;边距&#xff0c;边框&#xff0c;填充&#xff0c;和实…

调用阿里API实现图片中的文字识别

作者介绍 王雪玉&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff1a;2239580540qq.com 王泽宇&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生&#xf…

网规例题(二)

解题思路&#xff1a; 1.发送150000字节大小IP报文 数据帧长1518字节 首部18字节 可用数据1500字节 因此需要发送 100个数据帧 1518字节 1518*8 bit 带宽10 Mb/s 10 000 000 bps &#xff08;一&#xff09;发送100个数据帧的发送时延 0.12144 秒 &#xff08;二&#…

Java程序员不得不知道的一些设计模式

1、什么是设计模式 设计模式&#xff08;Design pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问&#xff0c;设计模式于己于他人于系统都是多赢…

【arXiv2303】Learning with Explicit Shape Priors for Medical Image Segmentation

Learning with Explicit Shape Priors for Medical Image Segmentation, aXiv2303 解读&#xff1a;SPM: 一种即插即用的形状先验模块&#xff0c;可轻松嵌入任意编解码架构&#xff0c;助力涨点并显著改善分割效果&#xff01; (qq.com) 论文&#xff1a;https://arxiv.org/…

基于Air103的DAP-link的硬件介绍

原文及固件链接 视频介绍链接 xkb7070-z 自锁式按键 上电开关 WAFER-SH1.0-6PWB 1.0间距卧贴插座 下载及通信接口 A2-4PA-2.54DS 4Pin接插件 纯下载接口 Air32F103CBT6 lqfp48 216MHz 256K Flash 32K RAM UD/UD- DP&DM信号 USB的差信号 R1 DIO监听 限流 PM254-2-04-W…

【3DsMAX】从零开始建房(7)

目录 1. 制作屋顶小船剩余部分 2. 制作小广告牌 1. 制作屋顶小船剩余部分 新建一个平面 长度分段设置为1 转换成可编辑多边形后&#xff0c;对边进行缩放 同样的方法再添加一个平面 添加“壳” 新建一个圆柱体作为桅杆 选中圆柱的底面&#xff0c;点击插入 挤出 将顶部的点缩…

深入理解深度学习——Transformer:编码器(Encoder)部分

分类目录&#xff1a;《深入理解深度学习》总目录 Transformer中的编码器不止一个&#xff0c;而是由一组 N N N个编码器串联而成。一个编码器的输出作为下一个编码器的输入。在下图中有 N N N个编码器&#xff0c;每一个编码器都从下方接收数据&#xff0c;再输出给上方。以此…

7年测试经验之谈,什么是模糊测试?

背景&#xff1a;近年来&#xff0c;随着信息技术的发展&#xff0c;各种新型自动化测试技术如雨后春笋般出现。其中&#xff0c;模糊测试&#xff08;fuzz testing&#xff09;技术开始受到行业关注&#xff0c;它尤其适用于发现未知的、隐蔽性较强的底层缺陷。这里&#xff0…

类的多继承的派生类的虚表的一些问题

虚表保存的其实并不是虚函数的地址&#xff0c;而是他的到jmp地址。 上我们的操作代码 class A { public:virtual void func1(){}virtual void func2(){}int a 1; };class B { public:virtual void func1(){}virtual void func2(){}int b 2; };class C : public A, public …

SAP HANA内存

用着用着HANA 数据库就慢了&#xff0c;原因都出在内存。 内存不足无非几个原因&#xff1a; 1.你的机器物理内存不足&#xff0c;这个好办&#xff0c;花钱扩。 2.你的HANA License容量不足&#xff0c;这个也好办&#xff0c;申请更大容量的内存License 3.你机器分配给HAN…

爬虫案例-使用Session登录指定网站(JS逆向AES-CBC加密+MD5加密)

总体概览&#xff1a;使用Session登录该网站&#xff0c;其中包括对password参数进行js逆向破解 &#xff08;涉及加密&#xff1a;md5加密AES-CBC加密&#xff09; 难度&#xff1a;两颗星 目标网址&#xff1a;aHR0cHM6Ly93d3cuZnhiYW9nYW8uY29tLw 下面文章将分为四个部分…

在后大流行时代利用Airbnb实现逆周期增长

回望近十年共享经济的发展历程&#xff0c;谁也不曾想到&#xff0c;最被看好的共享经济代表Uber竟在连年亏损后忍痛IPO&#xff0c;上市首日即破发&#xff0c;而主打「互联网房地产」模式的独角兽WeWork则上市失败&#xff0c;迅速失血&#xff0c;一度走到破产边缘。作为“共…