Function table的写法

最近遇到的一个问题是,C++如果需要写switch的时候,需要一大堆case的时候,应该怎么简化代码。有些时候,我希望case分支的个数由一个macro来定义,这写case就变得不可能了,比如下面这种: #define MAX_SUPPORTED 8 void…

Continue Reading Function table的写法

写Qt GUI程序的一些思考

最近自学了Qt,把以前的CLI程序功能重现一遍,算是完完整整地做了个GUI程序,GUI的开发思路和CLI是截然不同的,这里记录一下对此的一些思考: 1. 用户友好 以前的想法是GUI一定是比CLI用户友好的,但做了之后发现不一定,有些时候程序的选项特别多,怎么排布GUI控件也是一个大问题,简单粗暴地用LineEdit控件堆上去,结果还是和CLI没什么两样。我觉得要真正说的上“用户友好”,起码要做到以下几点: 对用户的输入进行检查,如果输入有误告诉用户错在哪里,并给用户修改输入的机会(程序不退出)。CLI下可以直接exit(),但GUI下这样做体验极差;鼠标hover到控件(特别是负责输入的控件)上方时,要有tooltip提示用户应该如何操作;运行长时间计算时,界面要有响应,不能像死机一样的,这就要求计算和GUI交互分开在不同的线程执行。在计算线程运行的时候,GUI要提示用户计算过程正在进行;单个输入控件应该可以反复修改而保持其它部分不变。用户在输入一套参数计算完成后,可能会修改部分参数重新计算,这时程序需要清理内部状态。如果做不到这一点,用户计算成功之后必须重启程序;…

Continue Reading 写Qt GUI程序的一些思考

Qt练习

也不知道以后还会不会写类似的文章,姑且标题先不加(1)吧。 1. 开发环境 IDE自然是qt-creator,linux系统下直接用包管理器装就是了,不过一般examples例程不在qt-creator的包里,如果是openSUSE的话,需要自己手动找到Qt各个component对应的example包,就是各种libqt5-*-examples。 2.…

Continue Reading Qt练习

跳蛙法(Leapfrog)积分运动方程

前面的欧拉法是一种最基本的积分方法,如果只知道位移对时间的一阶导数(速度)情况,使用欧拉法是比较好的选择,但如果还知道位移对时间的二阶导数(加速度)的话,使用二阶的Runge-Kutta方法,比如跳蛙法,是精度更好的选择。而且在分子模拟中,势能函数是已知的,加速度通常可以由牛顿动力学方程给出,故运动学积分部分一般使用跳蛙法或者Verlet法。 1. 问题 假设已知物体运动的加速度在\(t\)时刻\(y\)位置下的加速度\(a(y,t)\),初始时刻速度\(v(t_0)\),以及初始时刻的位置\(y(t_0)\),求解\(t\)时刻时物体的位置\(y(t)\)。 2.…

Continue Reading 跳蛙法(Leapfrog)积分运动方程

接触计算机的回忆

不知不觉中,我发现自己上网已经有二十多年了。近期心血来潮,流水账记录一下回忆,免得以后老年痴呆忘事。 小时候刚使用电脑时,还没有联网,家里有一台586电脑,装了windows 95系统,母亲会一点计算机操作,在某事业单位上班。母亲给电脑装了IBM莲花办公套件,它和后来的微软office很像,有文字处理和表格等程序。母亲教我打字就用里面的文字处理程序,软件名忘了(查了下叫WordPro),不过我还记得表格处理程序叫1-2-3。当时我拼音还没有学好,母亲也没有教键盘指法,都是随便乱敲。后来家里买了modem,可以拨号上网,刚开始是拨163,后来是96169,拨号的时候modem会响起一段电钻一样的噪声。那时母亲也买了不少电脑书,里面介绍了很多上网方式,什么ISDN、DSL还有专线,看着速率都比我们用的56Kbps拨号要快,心里想着,要是我们也能用上宽带就好了。 我上的十八线小城市的小学里也赶潮流开了电脑课,电脑课用的DOS,进去后就是字符界面,一个光标在闪,我们老师当时只教打字,反复打出黑板上写的一行字母就OK了,后来不知道怎么发现了按键盘上的某个F键(具体忘了是哪一个)就可以重复上一次打出的内容,于是就一直按着偷懒了。 后来搬家转学到省会,电脑也换了新的,网络不久也换成了ADSL,下行2M,上行512K。母亲不知道从哪里买来了一张金山画王的安装盘,装上之后我玩得不亦乐乎。省会小学电脑课的教学水平也高不少,不再是DOS了,系统是Windows…

Continue Reading 接触计算机的回忆

路径再参数化(reparametrization)问题

问题 给定一条由\(N\)个离散的点表示的路径(路径可以在任意维空间),我们希望移动这些点,移动后满足: 路径的总长度不变;路径每个点距离尽可能相等(均匀);路径形状尽量保持不变。 那么该如何移动这些点呢?这就是string method和PCV里面常见的再参数化问题。…

Continue Reading 路径再参数化(reparametrization)问题

武汉肺炎随想

有点想写些什么,但也不知道从何处下笔,我也不是什么专业人士,那就想到哪写到哪好了。 冠状病毒 冠状病毒其实是一个很大的分类,是一种正义单链RNA病毒,按照维基百科的说法,其中一些能引起常见的感冒,比如229E和OC43,著名的有SARS病毒,MERS病毒和这次的武汉肺炎病毒。冠状病毒在人类中主要引起呼吸道感染。 我对病毒学了解不多,总以为像以前在生物课上学的那样,复制都是按照中心法则的,像HIV病毒,把RNA逆转录成DNA,再以DNA为模板转录成RNA并翻译到蛋白质。看了资料之后才明白,冠状病毒复制过程不需要DNA参与,它本身可以合成RNA复制酶,以自身RNA为模板复制新的RNA链。 RNA复制酶也很有意思,在不同的病毒中是高度保守的,与真核生物的端粒酶也有亲缘关系。(https://en.wikipedia.org/wiki/RNA-dependent_RNA_polymerase#Distribution)…

Continue Reading 武汉肺炎随想

计算collective variable的平均力

刚入行时被这个问题烦恼了好久,后来看了不少文献,总算是弄明白了,在这里记录一下吧。 1. 问题 MD模拟中有很多时候需要计算一个collective variable…

Continue Reading 计算collective variable的平均力

CUDA检测指针所指内容的位置

前一段时间调试多GPU的代码,快被指针问题搞疯。最后发现输入和输出的指针并不在同一个GPU上。查了stackoverflow和文档(https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__UNIFIED.html#group__CUDART__UNIFIED_1gd89830e17d399c064a2f3c3fa8bb4390)才发现,利用cudaPointerAttributes可以很方便地检测指针所指内容在不在host上,在哪个device上。包装一下,代码如下: #include <iostream> template <typename…

Continue Reading CUDA检测指针所指内容的位置