(DELL) Carte PCI Express : unsupported PM cap regs version (7)

54 x served & 21 x viewed

J’ai deux cartes PCI Express qui fonctionnaient correctement avec des anciens serveurs DELL :

  • PowerEdge R710.
  • PowerEdge R410.
  • Precision T5600.
  • PowerEdge 2950.

Maintenant avec le serveur DELL PowerEdge R430 (BIOS Version 2.3.4), j’ai l’erreur : 0.544581 pci 0000:0704.0: unsupported PM cap regs version (7) ou alors un écran noir.

J’ai cherché sur les forums mais sans trouver de solutions…. et le support DELL ne traite que si les carte PCI express sont de chez DELL.

Il va falloir que j’explore … ajouter par exemple :  noapic nolapic acpi=off dans /boot/grub/menu.lst ou /boot/grub2/grub.cfg

Misère.

Pour information :

PM cap regs version = Power Management capabilities register version 7.

Exemple de lspci -vvv : (on peut faire aussi : lspci -vvv | grep « Power Management » )

0f:03.0 PCI bridge: Texas Instruments PCI2050 PCI-to-PCI Bridge (rev 02) (prog-if 00 [Normal decode])

        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+ Stepping- SERR+ FastB2B- DisINTx-

        Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-

        Latency: 32, Cache Line Size: 64 bytes

        Bus: primary=0f, secondary=10, subordinate=10, sec-latency=32

        I/O behind bridge: 0000d000-0000dfff

        Memory behind bridge: d2000000-d3ffffff

        Prefetchable memory behind bridge: 00000000fff00000-00000000000fffff

        Secondary status: 66MHz+ FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- <SERR- <PERR-

        BridgeCtl: Parity- SERR+ NoISA+ VGA- MAbort- >Reset- FastB2B-

                PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-

        Capabilities: [dc] Power Management version 2

                Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)

                Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-

                Bridge: PM- B3+

10:04.0 Bridge: PLX Technology, Inc. PCI9054 32-bit 33MHz PCI <-> IOBus Bridge (rev 0a)

        Subsystem: PLX Technology, Inc. Device b395

        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr+ Stepping- SERR+ FastB2B- DisINTx-

        Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-

        Latency: 32, Cache Line Size: 64 bytes

        Interrupt: pin A routed to IRQ 5

        Region 0: Memory at d3effc00 (32-bit, non-prefetchable) [size=256]

        Region 1: I/O ports at dc00 [size=256]

        Region 2: Memory at d2000000 (32-bit, non-prefetchable) [size=16M]

        Region 3: I/O ports at d800 [size=256]

        Capabilities: [40] Power Management version 1

                Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)

                Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-

        Capabilities: [48] #00 [0080]

Solution :

Modification du grub2.cfg pour la suppression de l’APIC (Advanced Configuration and Power Interface) :

splash : pour afficher le splashscreen lors du boot.
99c99
<       linux16 /vmlinuz-4.1.12-61.1.18.el7uek.x86_64 root=/dev/mapper/ol-root ro crashkernel=auto rd.lvm.lv=ol/root rd.lvm.lv=ol/swap rhgb quiet LANG=en_US.UTF-8
---
>       linux16 /vmlinuz-4.1.12-61.1.18.el7uek.x86_64 root=/dev/mapper/ol-root ro crashkernel=auto rd.lvm.lv=ol/root rd.lvm.lv=ol/swap rhgb quiet splash noapic nolapic acpi=off LANG=en_US.UTF-8
128c128
<       linux16 /vmlinuz-0-rescue-cfef1470d70044ec805b8e88d22bf265 root=/dev/mapper/ol-root ro crashkernel=auto rd.lvm.lv=ol/root rd.lvm.lv=ol/swap rhgb quiet
---
>       linux16 /vmlinuz-0-rescue-cfef1470d70044ec805b8e88d22bf265 root=/dev/mapper/ol-root ro crashkernel=auto rd.lvm.lv=ol/root rd.lvm.lv=ol/swap rhgb quiet splash noapic nolapic acpi=off

Voici le diff sur le lscpi, avec et sans carte :

27,29c27,28
< 06:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
< 06:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
< 08:00.0 PCI bridge: Renesas Technology Corp. SH7758 PCIe Switch [PS] 
--- 
> 06:00.0 PCI bridge: PLX Technology, Inc. PEX8112 x1 Lane PCI Express-to-PCI Bridge (rev aa)
> 07:04.0 Ethernet controller: Micrel-Kendin Device 8841 (rev 10)
31,90c30,32
< 0a:00.0 PCI bridge: Renesas Technology Corp. SH7758 PCIe-PCI Bridge [PPB]
< 0b:00.0 VGA compatible controller: Matrox Electronics Systems Ltd. G200eR2 (rev 01)
< ff:0b.0 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link 0/1 (rev 01)
< ff:0b.1 Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link 0/1 (rev 01)
< ff:0b.2 Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link 0/1 (rev 01)
< ff:0b.3 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link Debug (rev 01)
< ff:0c.0 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 01)
< ff:0c.1 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 01)
< ff:0c.2 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 01)
< ff:0c.3 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 01)
< ff:0c.4 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 01)
< ff:0c.5 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 01)
< ff:0f.0 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 01)
< ff:0f.1 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 01)
< ff:0f.4 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 01)
< ff:0f.5 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 01)
< ff:0f.6 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 01)
< ff:10.0 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R2PCIe Agent (rev 01)
< ff:10.1 Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R2PCIe Agent (rev 01)
< ff:10.5 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Ubox (rev 01)
< ff:10.6 Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Ubox (rev 01)
< ff:10.7 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Ubox (rev 01)
< ff:12.0 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 0 (rev 01)
< ff:12.1 Performance counters: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 0 (rev 01)
< ff:12.2 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 0 Debug (rev 01)
< ff:13.0 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Target Address/Thermal/RAS (rev 01)
< ff:13.1 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Target Address/Thermal/RAS (rev 01)
< ff:13.2 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder (rev 01)
< ff:13.3 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder (rev 01)
< ff:13.4 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder (rev 01)
< ff:13.5 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder (rev 01)
< ff:13.6 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Broadcast (rev 01)
< ff:13.7 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Global Broadcast (rev 01)
< ff:14.0 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 0 Thermal Control (rev 01)
< ff:14.1 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 1 Thermal Control (rev 01)
< ff:14.2 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 0 Error (rev 01)
< ff:14.3 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 1 Error (rev 01)
< ff:14.4 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface (rev 01)
< ff:14.5 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface (rev 01)
< ff:14.6 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface (rev 01)
< ff:14.7 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface (rev 01)
< ff:15.0 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 2 Thermal Control (rev 01)
< ff:15.1 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 3 Thermal Control (rev 01)
< ff:15.2 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 2 Error (rev 01)
< ff:15.3 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 3 Error (rev 01)
< ff:16.0 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Target Address/Thermal/RAS (rev 01)
< ff:16.6 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 2/3 Broadcast (rev 01)
< ff:16.7 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Global Broadcast (rev 01)
< ff:17.0 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 1 - Channel 0 Thermal Control (rev 01)
< ff:17.4 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 2/3 Interface (rev 01)
< ff:17.5 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 2/3 Interface (rev 01)
< ff:17.6 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 2/3 Interface (rev 01)
< ff:17.7 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 2/3 Interface (rev 01)
< ff:1e.0 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 01)
< ff:1e.1 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 01)
< ff:1e.2 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 01)
< ff:1e.3 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 01)
< ff:1e.4 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 01)
< ff:1f.0 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 01)
< ff:1f.2 System peripheral: Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 01) 
--- 
> 0a:00.0 PCI bridge: Renesas Technology Corp. SH7758 PCIe Switch [PS]
> 0b:00.0 PCI bridge: Renesas Technology Corp. SH7758 PCIe-PCI Bridge [PPB]
> 0c:00.0 VGA compatible controller: Matrox Electronics Systems Ltd. G200eR2 (rev 01)

Et si je regarde la carte qui a la version 7 :

07:04.0 Ethernet controller: Micrel-Kendin Device 8841 (rev 10)
        Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+ Stepping- SERR+ FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 0 (5000ns min, 10000ns max)
        Interrupt: pin A routed to IRQ 15
        Region 0: Memory at 91c00000 (32-bit, non-prefetchable) [size=2K]
        Capabilities: [50] Power Management version 7
                Flags: PMEClk+ DSI+ D1+ D2+ AuxCurrent=0mA PME(D0-,D1+,D2+,D3hot+,D3cold-)
                Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-

Conclusion :
J’ai bien ma carte qui fonctionne mais je n’ai plus de gestion ACPI.

PostgreSQL : Maximum de connexion en simultanés

1796 x served & 811 x viewed

Jusqu’à présent la limite était dû à ce paramètre du noyau:

  • cat /proc/sys/kernel/shmmax

Il fallait donc modifier le kernel avec la commande suivante :

  • sysctl -w kernel.shmmax=valeur

ou encore :

  • sysctl -p /etc/sysctl.conf

La règle de calcul étant : shmmax = 250 Ko + 8.2 Ko * shared_buffers + 14.2 Ko * max_connections.

Autre information, la commande suivante permet de voir le nombre de connexion en temps réel : « SELECT * FROM pg_catalog.pg_stat_activity; »

Pour voir le nombre de connexion max, il suffit de faire cela :

SELECT current_setting(‘max_connections’); 

ou encore

SHOW all;

Voici donc un petit historique sur quelques versions de linux, je n’ai pas la prétention de dire que ma configuration est optimale. Je veux juste indiquer la limite que j’ai trouvé pour chaque OS et chaque configuration :

Redhat 7.2 32 bits :

Redhat 8.0 32 bits :

Voici un premier exemple de configuration :

[root@Redhat8]# uname -a
Linux Redhat8.0 2.4.18-14 #1 Wed Sep 4 13:35:50 EDT 2002 i686 i686 i386 GNU/Linux
[root@Redhat8]# rpm -qa | grep postgresql
postgresql-server-7.2.2-1
postgresql-libs-7.2.2-1
postgresql-7.2.2-1
postgresql-devel-7.2.2-1
[root@Redhat8]# ulimit -a
core file size        (blocks, -c) 0
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
max locked memory     (kbytes, -l) unlimited
max memory size       (kbytes, -m) unlimited
open files                    (-n) 1024
pipe size          (512 bytes, -p) 8
stack size            (kbytes, -s) 8192
cpu time             (seconds, -t) unlimited
max user processes            (-u) 7168
virtual memory        (kbytes, -v) unlimited
[root@Redhat8]# sysctl -a | grep "shmmax"
kernel.shmmax = 33554432
[root@Redhat8]# cat /var/lib/pgsql/data/postgresql.conf
tcpip_socket = true          #
max_connections = 496        #
sort_mem = 16384              #
shared_buffers = 2048        #
wal_buffers = 256            #
debug_level = 0              #
debug_print_query = false
debug_print_parse = false
debug_print_rewritten = false
debug_print_plan = false
debug_pretty_print = false
deadlock_timeout = 600   #
vacuum_mem = 36864   #

A noter :

# show max_connections;
NOTICE:  max_connections is 496
SHOW VARIABLE
# show shared_buffers;
NOTICE:  shared_buffers is 2048
SHOW VARIABLE

Fédora 9 32 bits :

[root@FC9 ~]# uname -a
Linux FC9 2.6.25-14.fc9.i686 #1 SMP Thu May 1 06:28:41 EDT 2008 i686 i686 i386 GNU/Linux
[root@FC9 ~]# rpm -qa | grep postgresql
postgresql-libs-8.3.1-1.fc9.i386
postgresql-python-8.3.1-1.fc9.i386
postgresql-8.3.1-1.fc9.i386
postgresql-server-8.3.1-1.fc9.i386
postgresql-devel-8.3.1-1.fc9.i386
[root@FC9 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 65536
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@FC9 ~]# sysctl -a | grep "shmmax"
kernel.shmmax = 33554432
[root@FC9 ~]# cat /var/lib/pgsql/data/postgresql.conf
max_connections = 200
shared_buffers = 4MB
temp_buffers = 8MB
work_mem = 16MB
maintenance_work_mem = 4MB
wal_buffers = 8MB
checkpoint_segments = 128
effective_cache_size = 128MB
cpu_tuple_cost = 0.0030
cpu_index_tuple_cost = 0.0010
cpu_operator_cost = 0.0005
fsync = off
checkpoint_timeout = 1h
port = 5432                             # (change requires restart)
logging_collector = off                  # Enable capturing of stder and csvlog
log_filename = 'postgresql-%a.log'      # log file name pattern,
log_truncate_on_rotation = on           # If on, an existing log file with the
log_rotation_age = 1d                   # Automatic rotation of logfiles will
log_rotation_size = 0                   # Automatic rotation of logfiles will
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'                     # locale for system error message
lc_monetary = 'en_US.UTF-8'                     # locale for monetary formatting
lc_numeric = 'en_US.UTF-8'                      # locale for number formatting
lc_time = 'en_US.UTF-8'                         # locale for time formatting
default_text_search_config = 'pg_catalog.english'

Fédora 14 32 bits :

Voici les informations sur l’OS, voici un exemple de configuration :

[root@Fedora14]# uname -a
Linux Fedora14 2.6.35.6-48.fc14.i686 #1 SMP Fri Oct 22 15:34:36 UTC 2010 i686 i686 i386 GNU/Linux
[root@Fedora14]# rpm -qa | grep "postgresql"
postgresql-devel-8.4.5-1.fc14.i686
postgresql-plperl-8.4.5-1.fc14.i686
postgresql-libs-8.4.5-1.fc14.i686
postgresql-8.4.5-1.fc14.i686
postgresql-server-8.4.5-1.fc14.i686
[root@Fedora14]# ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 25000
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 8000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 20000
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@Fedora14]# sysctl -a | grep "shmmax"
kernel.shmmax = 33554432
[root@Fedora14]# ipcs -l
 
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 32768
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1
 
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
 
------ Messages Limits --------
max queues system wide = 1397
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
[root@Fedora14]# cat /var/lib/pgsql/data/postgresql.conf
max_connections = 201  #
temp_buffers = 2000    #
work_mem=200MB         #
wal_buffers = 2500     #
port = 5432            #
logging_collector = on #

Si on essaye de mettre 202 dans le fichier postgresql.conf alors celui-ci refuse de se lancer. La limite semble être à 201 connexions en simultanées.

A noter que si je regarde la paramètre shared_buffers :

# show max_connections;
max_connections
-----------------
201
(1 row)
# show shared_buffers;
shared_buffers
----------------
8MB
(1 row)

Si je diminue la taille de shared_buffers, je peux alors augmenter le nombre de connexion en simultanée :

[root@Fedora14 xatm]# cat /var/lib/pgsql/data/postgresql.conf
max_connections = 437
temp_buffers = 2000
shared_buffers = 4MB
work_mem=200MB
wal_buffers = 2500
port = 5432
logging_collector = on #

Fédora 17 32 bits :

[root@FC17 ~]# uname -a
Linux FC17 3.3.4-5.fc17.i686 #1 SMP Mon May 7 17:45:26 UTC 2012 i686 i686 i386 GNU/Linux
[root@FC17 ~]# rpm -qa | grep postgresql
postgresql-server-9.1.9-1.fc17.i686
postgresql-9.1.9-1.fc17.i686
postgresql-devel-9.1.9-1.fc17.i686
postgresql-libs-9.1.9-1.fc17.i686
[root@FC17 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 23753
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@FC17 ~]# sysctl -a | grep "shmmax"
kernel.shmmax = 33554432
[root@FC17 ~]# ipcs -l
 
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 32768
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1
 
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
 
------ Messages Limits --------
max queues system wide = 1684
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
[root@FC17 ~]# cat /var/lib/pgsql/data/postgresql.conf
port = 5432                             # (change requires restart)
max_connections = 935                   # (change requires restart)
shared_buffers = 4MB                   # min 128kB
logging_collector = on                  # Enable capturing of stderr and csvlog
log_filename = 'postgresql-%a.log'      # log file name pattern,
log_truncate_on_rotation = on           # If on, an existing log file with the
log_rotation_age = 1d                   # Automatic rotation of logfiles will
log_rotation_size = 0                   # Automatic rotation of logfiles will
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'                     # locale for system error message
lc_monetary = 'en_US.UTF-8'                     # locale for monetary formatting
lc_numeric = 'en_US.UTF-8'                      # locale for number formatting
lc_time = 'en_US.UTF-8'                         # locale for time formatting
default_text_search_config = 'pg_catalog.english'

Voici la liste complète des paramètres :

show all;
              name               |               setting               |                                                          description
---------------------------------+-------------------------------------+-------------------------------------------------------------------------------------------------------------------------------
allow_system_table_mods         | off                                 | Allows modifications of the structure of system tables.
application_name                | psql                                | Sets the application name to be reported in statistics and logs.
archive_command                 | (disabled)                          | Sets the shell command that will be called to archive a WAL file.
archive_mode                    | off                                 | Allows archiving of WAL files using archive_command.
archive_timeout                 | 0                                   | Forces a switch to the next xlog file if a new file has not been started within N seconds.
array_nulls                     | on                                  | Enable input of NULL elements in arrays.
authentication_timeout          | 1min                                | Sets the maximum allowed time to complete client authentication.
autovacuum                      | on                                  | Starts the autovacuum subprocess.
autovacuum_analyze_scale_factor | 0.1                                 | Number of tuple inserts, updates or deletes prior to analyze as a fraction of reltuples.
autovacuum_analyze_threshold    | 50                                  | Minimum number of tuple inserts, updates or deletes prior to analyze.
autovacuum_freeze_max_age       | 200000000                           | Age at which to autovacuum a table to prevent transaction ID wraparound.
autovacuum_max_workers          | 3                                   | Sets the maximum number of simultaneously running autovacuum worker processes.
autovacuum_naptime              | 1min                                | Time to sleep between autovacuum runs.
autovacuum_vacuum_cost_delay    | 20ms                                | Vacuum cost delay in milliseconds, for autovacuum.
autovacuum_vacuum_cost_limit    | -1                                  | Vacuum cost amount available before napping, for autovacuum.
autovacuum_vacuum_scale_factor  | 0.2                                 | Number of tuple updates or deletes prior to vacuum as a fraction of reltuples.
autovacuum_vacuum_threshold     | 50                                  | Minimum number of tuple updates or deletes prior to vacuum.
backslash_quote                 | safe_encoding                       | Sets whether "\'" is allowed in string literals.
bgwriter_delay                  | 200ms                               | Background writer sleep time between rounds.
bgwriter_lru_maxpages           | 100                                 | Background writer maximum number of LRU pages to flush per round.
bgwriter_lru_multiplier         | 2                                   | Multiple of the average buffer usage to free per round.
block_size                      | 8192                                | Shows the size of a disk block.
bonjour                         | off                                 | Enables advertising the server via Bonjour.
bonjour_name                    |                                     | Sets the Bonjour service name.
bytea_output                    | hex                                 | Sets the output format for bytea.
check_function_bodies           | on                                  | Check function bodies during CREATE FUNCTION.
checkpoint_completion_target    | 0.5                                 | Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval.
checkpoint_segments             | 3                                   | Sets the maximum distance in log segments between automatic WAL checkpoints.
checkpoint_timeout              | 5min                                | Sets the maximum time between automatic WAL checkpoints.
checkpoint_warning              | 30s                                 | Enables warnings if checkpoint segments are filled more frequently than this.
client_encoding                 | UTF8                                | Sets the client's character set encoding.
client_min_messages             | notice                              | Sets the message levels that are sent to the client.
commit_delay                    | 0                                   | Sets the delay in microseconds between transaction commit and flushing WAL to disk.
commit_siblings                 | 5                                   | Sets the minimum concurrent open transactions before performing commit_delay.
config_file                     | /var/lib/pgsql/data/postgresql.conf | Sets the server's main configuration file.
constraint_exclusion            | partition                           | Enables the planner to use constraints to optimize queries.
cpu_index_tuple_cost            | 0.005                               | Sets the planner's estimate of the cost of processing each index entry during an index scan.
cpu_operator_cost               | 0.0025                              | Sets the planner's estimate of the cost of processing each operator or function call.
cpu_tuple_cost                  | 0.01                                | Sets the planner's estimate of the cost of processing each tuple (row).
cursor_tuple_fraction           | 0.1                                 | Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved.
custom_variable_classes         |                                     | Sets the list of known custom variable classes.
data_directory                  | /var/lib/pgsql/data                 | Sets the server's data directory.
DateStyle                       | ISO, MDY                            | Sets the display format for date and time values.
db_user_namespace               | off                                 | Enables per-database user names.
deadlock_timeout                | 1s                                  | Sets the time to wait on a lock before checking for deadlock.
debug_assertions                | off                                 | Turns on various assertion checks.
debug_pretty_print              | on                                  | Indents parse and plan tree displays.
debug_print_parse               | off                                 | Logs each query's parse tree.
debug_print_plan                | off                                 | Logs each query's execution plan.
debug_print_rewritten           | off                                 | Logs each query's rewritten parse tree.
default_statistics_target       | 100                                 | Sets the default statistics target.
default_tablespace              |                                     | Sets the default tablespace to create tables and indexes in.
default_text_search_config      | pg_catalog.english                  | Sets default text search configuration.
default_transaction_deferrable  | off                                 | Sets the default deferrable status of new transactions.
default_transaction_isolation   | read committed                      | Sets the transaction isolation level of each new transaction.
default_transaction_read_only   | off                                 | Sets the default read-only status of new transactions.
default_with_oids               | off                                 | Create new tables with OIDs by default.
dynamic_library_path            | $libdir                             | Sets the path for dynamically loadable modules.
effective_cache_size            | 128MB                               | Sets the planner's assumption about the size of the disk cache.
effective_io_concurrency        | 1                                   | Number of simultaneous requests that can be handled efficiently by the disk subsystem.
enable_bitmapscan               | on                                  | Enables the planner's use of bitmap-scan plans.
enable_hashagg                  | on                                  | Enables the planner's use of hashed aggregation plans.
enable_hashjoin                 | on                                  | Enables the planner's use of hash join plans.
enable_indexscan                | on                                  | Enables the planner's use of index-scan plans.
enable_material                 | on                                  | Enables the planner's use of materialization.
enable_mergejoin                | on                                  | Enables the planner's use of merge join plans.
enable_nestloop                 | on                                  | Enables the planner's use of nested-loop join plans.
enable_seqscan                  | on                                  | Enables the planner's use of sequential-scan plans.
enable_sort                     | on                                  | Enables the planner's use of explicit sort steps.
enable_tidscan                  | on                                  | Enables the planner's use of TID scan plans.
escape_string_warning           | on                                  | Warn about backslash escapes in ordinary string literals.
exit_on_error                   | off                                 | Terminate session on any error.
external_pid_file               |                                     | Writes the postmaster PID to the specified file.
extra_float_digits              | 0                                   | Sets the number of digits displayed for floating-point values.
from_collapse_limit             | 8                                   | Sets the FROM-list size beyond which subqueries are not collapsed.
fsync                           | on                                  | Forces synchronization of updates to disk.
full_page_writes                | on                                  | Writes full pages to WAL when first modified after a checkpoint.
geqo                            | on                                  | Enables genetic query optimization.
geqo_effort                     | 5                                   | GEQO: effort is used to set the default for other GEQO parameters.
geqo_generations                | 0                                   | GEQO: number of iterations of the algorithm.
geqo_pool_size                  | 0                                   | GEQO: number of individuals in the population.
geqo_seed                       | 0                                   | GEQO: seed for random path selection.
geqo_selection_bias             | 2                                   | GEQO: selective pressure within the population.
geqo_threshold                  | 12                                  | Sets the threshold of FROM items beyond which GEQO is used.
gin_fuzzy_search_limit          | 0                                   | Sets the maximum allowed result for exact search by GIN.
hba_file                        | /var/lib/pgsql/data/pg_hba.conf     | Sets the server's "hba" configuration file.
hot_standby                     | off                                 | Allows connections and queries during recovery.
hot_standby_feedback            | off                                 | Allows feedback from a hot standby to the primary that will avoid query conflicts.
ident_file                      | /var/lib/pgsql/data/pg_ident.conf   | Sets the server's "ident" configuration file.
ignore_system_indexes           | off                                 | Disables reading from system indexes.
integer_datetimes               | on                                  | Datetimes are integer based.
IntervalStyle                   | postgres                            | Sets the display format for interval values.
join_collapse_limit             | 8                                   | Sets the FROM-list size beyond which JOIN constructs are not flattened.
krb_caseins_users               | off                                 | Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive.
krb_server_keyfile              | FILE:/etc/krb5.keytab               | Sets the location of the Kerberos server key file.
krb_srvname                     | postgres                            | Sets the name of the Kerberos service.
lc_collate                      | en_US.UTF-8                         | Shows the collation order locale.
lc_ctype                        | en_US.UTF-8                         | Shows the character classification and case conversion locale.
lc_messages                     | en_US.UTF-8                         | Sets the language in which messages are displayed.
lc_monetary                     | en_US.UTF-8                         | Sets the locale for formatting monetary amounts.
lc_numeric                      | en_US.UTF-8                         | Sets the locale for formatting numbers.
lc_time                         | en_US.UTF-8                         | Sets the locale for formatting date and time values.
listen_addresses                | localhost                           | Sets the host name or IP address(es) to listen to.
lo_compat_privileges            | off                                 | Enables backward compatibility mode for privilege checks on large objects.
local_preload_libraries         |                                     | Lists shared libraries to preload into each backend.
log_autovacuum_min_duration     | -1                                  | Sets the minimum execution time above which autovacuum actions will be logged.
log_checkpoints                 | off                                 | Logs each checkpoint.
log_connections                 | off                                 | Logs each successful connection.
log_destination                 | stderr                              | Sets the destination for server log output.
log_directory                   | pg_log                              | Sets the destination directory for log files.
log_disconnections              | off                                 | Logs end of a session, including duration.
log_duration                    | off                                 | Logs the duration of each completed SQL statement.
log_error_verbosity             | default                             | Sets the verbosity of logged messages.
log_executor_stats              | off                                 | Writes executor performance statistics to the server log.
log_file_mode                   | 0600                                | Sets the file permissions for log files.
log_filename                    | postgresql-%a.log                   | Sets the file name pattern for log files.
log_hostname                    | off                                 | Logs the host name in the connection logs.
log_line_prefix                 |                                     | Controls information prefixed to each log line.
log_lock_waits                  | off                                 | Logs long lock waits.
log_min_duration_statement      | -1                                  | Sets the minimum execution time above which statements will be logged.
log_min_error_statement         | error                               | Causes all statements generating error at or above this level to be logged.
log_min_messages                | warning                             | Sets the message levels that are logged.
log_parser_stats                | off                                 | Writes parser performance statistics to the server log.
log_planner_stats               | off                                 | Writes planner performance statistics to the server log.
log_rotation_age                | 1d                                  | Automatic log file rotation will occur after N minutes.
log_rotation_size               | 0                                   | Automatic log file rotation will occur after N kilobytes.
log_statement                   | none                                | Sets the type of statements logged.
log_statement_stats             | off                                 | Writes cumulative performance statistics to the server log.
log_temp_files                  | -1                                  | Log the use of temporary files larger than this number of kilobytes.
log_timezone                    | Europe/Paris                        | Sets the time zone to use in log messages.
log_truncate_on_rotation        | on                                  | Truncate existing log files of same name during log rotation.
logging_collector               | on                                  | Start a subprocess to capture stderr output and/or csvlogs into log files.
maintenance_work_mem            | 16MB                                | Sets the maximum memory to be used for maintenance operations.
max_connections                 | 935                                 | Sets the maximum number of concurrent connections.
max_files_per_process           | 1000                                | Sets the maximum number of simultaneously open files for each server process.
max_function_args               | 100                                 | Shows the maximum number of function arguments.
max_identifier_length           | 63                                  | Shows the maximum identifier length.
max_index_keys                  | 32                                  | Shows the maximum number of index keys.
max_locks_per_transaction       | 64                                  | Sets the maximum number of locks per transaction.
max_pred_locks_per_transaction  | 64                                  | Sets the maximum number of predicate locks per transaction.
max_prepared_transactions       | 0                                   | Sets the maximum number of simultaneously prepared transactions.
max_stack_depth                 | 2MB                                 | Sets the maximum stack depth, in kilobytes.
max_standby_archive_delay       | 30s                                 | Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data.
max_standby_streaming_delay     | 30s                                 | Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data.
max_wal_senders                 | 0                                   | Sets the maximum number of simultaneously running WAL sender processes.
password_encryption             | on                                  | Encrypt passwords.
port                            | 5432                                | Sets the TCP port the server listens on.
post_auth_delay                 | 0                                   | Waits N seconds on connection startup after authentication.
pre_auth_delay                  | 0                                   | Waits N seconds on connection startup before authentication.
quote_all_identifiers           | off                                 | When generating SQL fragments, quote all identifiers.
random_page_cost                | 4                                   | Sets the planner's estimate of the cost of a nonsequentially fetched disk page.
replication_timeout             | 1min                                | Sets the maximum time to wait for WAL replication.
restart_after_crash             | on                                  | Reinitialize server after backend crash.
search_path                     | "$user",public                      | Sets the schema search order for names that are not schema-qualified.
segment_size                    | 1GB                                 | Shows the number of pages per disk file.
seq_page_cost                   | 1                                   | Sets the planner's estimate of the cost of a sequentially fetched disk page.
server_encoding                 | UTF8                                | Sets the server (database) character set encoding.
server_version                  | 9.1.9                               | Shows the server version.
server_version_num              | 90109                               | Shows the server version as an integer.
session_replication_role        | origin                              | Sets the session's behavior for triggers and rewrite rules.
shared_buffers                  | 4MB                                 | Sets the number of shared memory buffers used by the server.
shared_preload_libraries        |                                     | Lists shared libraries to preload into server.
silent_mode                     | off                                 | Runs the server silently.
sql_inheritance                 | on                                  | Causes subtables to be included by default in various commands.
ssl                             | off                                 | Enables SSL connections.
ssl_ciphers                     | ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH   | Sets the list of allowed SSL ciphers.
ssl_renegotiation_limit         | 512MB                               | Set the amount of traffic to send and receive before renegotiating the encryption keys.
standard_conforming_strings     | on                                  | Causes '...' strings to treat backslashes literally.
statement_timeout               | 0                                   | Sets the maximum allowed duration of any statement.
stats_temp_directory            | pg_stat_tmp                         | Writes temporary statistics files to the specified directory.
superuser_reserved_connections  | 3                                   | Sets the number of connection slots reserved for superusers.
synchronize_seqscans            | on                                  | Enable synchronized sequential scans.
synchronous_commit              | on                                  | Sets the current transaction's synchronization level.
synchronous_standby_names       |                                     | List of names of potential synchronous standbys.
syslog_facility                 | local0                              | Sets the syslog "facility" to be used when syslog enabled.
syslog_ident                    | postgres                            | Sets the program name used to identify PostgreSQL messages in syslog.
tcp_keepalives_count            | 0                                   | Maximum number of TCP keepalive retransmits.
tcp_keepalives_idle             | 0                                   | Time between issuing TCP keepalives.
tcp_keepalives_interval         | 0                                   | Time between TCP keepalive retransmits.
temp_buffers                    | 8MB                                 | Sets the maximum number of temporary buffers used by each session.
temp_tablespaces                |                                     | Sets the tablespace(s) to use for temporary tables and sort files.
TimeZone                        | Europe/Paris                        | Sets the time zone for displaying and interpreting time stamps.
timezone_abbreviations          | Default                             | Selects a file of time zone abbreviations.
trace_notify                    | off                                 | Generates debugging output for LISTEN and NOTIFY.
trace_recovery_messages         | log                                 | Enables logging of recovery-related debugging information.
trace_sort                      | off                                 | Emit information about resource usage in sorting.
track_activities                | on                                  | Collects information about executing commands.
track_activity_query_size       | 1024                                | Sets the size reserved for pg_stat_activity.current_query, in bytes.
track_counts                    | on                                  | Collects statistics on database activity.
track_functions                 | none                                | Collects function-level statistics on database activity.
transaction_deferrable          | off                                 | Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures.
transaction_isolation           | read committed                      | Sets the current transaction's isolation level.
transaction_read_only           | off                                 | Sets the current transaction's read-only status.
transform_null_equals           | off                                 | Treats "expr=NULL" as "expr IS NULL".
unix_socket_directories         | /var/run/postgresql, /tmp           | Sets the directories where Unix-domain sockets will be created.
unix_socket_group               |                                     | Sets the owning group of the Unix-domain socket.
unix_socket_permissions         | 0777                                | Sets the access permissions of the Unix-domain socket.
update_process_title            | on                                  | Updates the process title to show the active SQL command.
vacuum_cost_delay               | 0                                   | Vacuum cost delay in milliseconds.
vacuum_cost_limit               | 200                                 | Vacuum cost amount available before napping.
vacuum_cost_page_dirty          | 20                                  | Vacuum cost for a page dirtied by vacuum.
vacuum_cost_page_hit            | 1                                   | Vacuum cost for a page found in the buffer cache.
vacuum_cost_page_miss           | 10                                  | Vacuum cost for a page not found in the buffer cache.
vacuum_defer_cleanup_age        | 0                                   | Number of transactions by which VACUUM and HOT cleanup should be deferred, if any.
vacuum_freeze_min_age           | 50000000                            | Minimum age at which VACUUM should freeze a table row.
vacuum_freeze_table_age         | 150000000                           | Age at which VACUUM should scan whole table to freeze tuples.
wal_block_size                  | 8192                                | Shows the block size in the write ahead log.
wal_buffers                     | 128kB                               | Sets the number of disk-page buffers in shared memory for WAL.
wal_keep_segments               | 0                                   | Sets the number of WAL files held for standby servers.
wal_level                       | minimal                             | Set the level of information written to the WAL.
wal_receiver_status_interval    | 10s                                 | Sets the maximum interval between WAL receiver status reports to the primary.
wal_segment_size                | 16MB                                | Shows the number of pages per write ahead log segment.
wal_sender_delay                | 1s                                  | WAL sender sleep time between WAL replications.
wal_sync_method                 | fdatasync                           | Selects the method used for forcing WAL updates to disk.
wal_writer_delay                | 200ms                               | WAL writer sleep time between WAL flushes.
work_mem                        | 1MB                                 | Sets the maximum memory to be used for query workspaces.
xmlbinary                       | base64                              | Sets how binary values are to be encoded in XML.
xmloption                       | content                             | Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments.
zero_damaged_pages              | off                                 | Continues processing past damaged page headers.

 

Fédora 17 64 bits :

Voici un exemple de configuration :

[root@fedora17-64b ~]# uname -a
Linux fedora17-64b 3.3.4-5.fc17.x86_64 #1 SMP Mon May 7 17:29:34 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
[root@fedora17-64b ~]# rpm -qa | grep "postgresql"
postgresql-server-9.1.9-1.fc17.x86_64
postgresql-libs-9.1.9-1.fc17.x86_64
postgresql-devel-9.1.9-1.fc17.x86_64
postgresql-9.1.9-1.fc17.x86_64
[root@fedora17-64b ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31448
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@fedora17-64b ~]# sysctl -a | grep "shmmax"
kernel.shmmax = 33554432
[root@fedora17-64b ~]# cat /var/lib/pgsql/data/postgresql.conf
max_connections = 400
shared_buffers = 4MB
temp_buffers = 8MB
work_mem = 16MB
maintenance_work_mem = 4MB
wal_buffers = 8MB
checkpoint_segments = 128
effective_cache_size = 4MB
cpu_tuple_cost = 0.0030
cpu_index_tuple_cost = 0.0010
cpu_operator_cost = 0.0005
fsync = off
checkpoint_timeout = 1h
port = 5432                             # (change requires restart)
logging_collector = off                  # Enable capturing of stderr and csvlog
log_filename = 'postgresql-%a.log'      # log file name pattern,
log_truncate_on_rotation = on           # If on, an existing log file with the
log_rotation_age = 1d                   # Automatic rotation of logfiles will
log_rotation_size = 0                   # Automatic rotation of logfiles will
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'                     # locale for system error message
lc_monetary = 'en_US.UTF-8'                     # locale for monetary formatting
lc_numeric = 'en_US.UTF-8'                      # locale for number formatting
lc_time = 'en_US.UTF-8'                         # locale for time formatting
default_text_search_config = 'pg_catalog.english'

La limite semble être a 421 connexions en simultanées. Ensuite dès que l’on dépasse on obtient cette erreur.

pg_ctl[6217]: FATAL:  could not create shared memory segment: Invalid argument
pg_ctl[6217]: DETAIL:  Failed system call was shmget(key=5432001, size=33898496, 03600).
pg_ctl[6217]: HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.  ...connections.
pg_ctl[6217]: If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising t... called for.
pg_ctl[6217]: The PostgreSQL documentation contains more information about shared memory configuration.
pg_ctl[6217]: pg_ctl: could not start server

Si j’essaye de mettre le même fichier de configuration que la Fédora 17 32b, je n’arrive pas au même performance …

Oracle Linux 6.5 64 bits :

[root@ORACLE ~]# uname -a
Linux ORACLE 3.8.13-26.1.1.el6uek.x86_64 #2 SMP Thu Feb 13 19:42:43 PST 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@ORACLE ~]# sysctl -a | grep "shm"
kernel.shm_rmid_forced = 0
kernel.shmall = 4294967296
kernel.shmmax = 68719476736
kernel.shmmni = 4096
vm.hugetlb_shm_group = 0
[root@ORACLE ~]# ipcs -l
 
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 67108864
max total shared memory (kbytes) = 17179869184
min seg size (bytes) = 1
 
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
 
------ Messages: Limits --------
max queues system wide = 15615
max size of message (bytes) = 65536
default max size of queue (bytes) = 65536
[root@ORACLE ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 62292
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 62292
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@ORACLE ~]# rpm -qa | grep "postgresql"
postgresql-8.4.20-1.el6_5.x86_64
postgresql-devel-8.4.20-1.el6_5.x86_64
postgresql-libs-8.4.20-1.el6_5.x86_64
postgresql-server-8.4.20-1.el6_5.x86_64
[root@ORACLE ~]# cat /var/lib/pgsql/data/postgresql.conf
max_connections = 1975
temp_buffers = 2000
work_mem=200MB
wal_buffers = 2500
port = 5432
 
[root@ORACLE ~]# psql
psql (8.4.20)
Type "help" for help.
 
# show shared_buffers;
shared_buffers
----------------
8MB
(1 row)

A noter que le fichier /etc/sysctl.conf modifier la valeur shmall dans cette version de Linux.

[root@ORACLE ~]# grep "kernel." /etc/sysctl.conf
kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

Oracle Linux 7.0 64 bits :

[root@Oracle7 ~]# uname -a
Linux Oracle7 3.8.13-35.3.1.el7uek.x86_64 #2 SMP Wed Jun 25 15:27:43 PDT 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@Oracle7 ~]# sysctl -a | grep "shm"
kernel.shm_rmid_forced = 0
kernel.shmall = 268435456
kernel.shmmax = 4294967295
kernel.shmmni = 4096
vm.hugetlb_shm_group = 0
[root@Oracle7 ~]# ipcs -l
 
------ Messages Limits --------
max queues system wide = 3488
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
 
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 4194303
max total shared memory (kbytes) = 1073741824
min seg size (bytes) = 1
 
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
[root@Oracle7 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 13863
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 13863
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@Oracle7 ~]# rpm -qa | grep postgresql
postgresql-server-9.2.7-1.el7.x86_64
postgresql-devel-9.2.7-1.el7.x86_64
postgresql-libs-9.2.7-1.el7.x86_64
postgresql-docs-9.2.7-1.el7.x86_64
postgresql-9.2.7-1.el7.x86_64
[root@Oracle7 ~]# cat /var/lib/pgsql/data/postgresql.conf 
port = 5432                             # (change requires restart)
max_connections = 1958                  # (change requires restart)
shared_buffers = 32MB                   # min 128kB
logging_collector = on                  # Enable capturing of stderr and csvlog
log_filename = 'postgresql-%a.log'      
log_truncate_on_rotation = on          
log_rotation_age = 1d                   
log_rotation_size = 0                   
log_timezone = 'Europe/Paris'
datestyle = 'iso, mdy'
timezone = 'Europe/Paris'
lc_messages = 'en_US.UTF-8'             
lc_monetary = 'en_US.UTF-8'                    
lc_numeric = 'en_US.UTF-8'                      
lc_time = 'en_US.UTF-8'                         
default_text_search_config = 'pg_catalog.english'

Le fichier /etc/sysctl.conf est vide.

En résumé :

 

OS max_connections (limite) shared_buffers kernel.shmmax
Redhat 7.2 32b ?  ?  ?
Redhat 8.0 32b 496 2048 33554432
Fédora 9.0 32b 253 4MB 33554432
Fédora 14.0 32b 201 8MB 33554432
Fédora 14.0 32b 437 4MB 33554432
Fédora 17.0 32b 935 ? 4MB 33554432
Fédora 17.0 64b 421 4MB 33554432
Oracle Linux 6.5 64b 1975  8MB 68719476736
Oracle Linux 7.0 64b 1958  32MB 4294967295

Les versions de Linux que j’ai utilisé dans l’ordre chronologique, depuis que je travaille sous Linux:

Pour plus d’information sur cette limitation voir les liens suivants :

http://docs.postgresqlfr.org/8.1/kernel-resources.html

https://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling#Connection_Pooling_and_Acceleration

http://www.revsys.com/writings/postgresql-performance.html 

Carreaux de COONS sous MATLAB

230 x served & 79 x viewed

 » Carreaux de COONS avec MATLAB »

image1

Utilisation de l’interface graphique pour la création de carreaux de  » COONS « , et le raccordement de carreaux

Programmation de l’interface

image4

L’installation :

Tout díabord il faut copier les fichiers sous un même répertoire, ensuite lancer MATLAB sous ce répertoire, puis taper ëdepartí.

Premier pas :

image2

 

On commence par créer des carreaux, on choisit donc l’option Creation de CARREAU de COONS.

 

image3

La première étape consiste à placer les points A,B,C et D. On clique donc sur le bouton « Placer A,B,C,D ».

Grâce au système de placement des points, il est possible de placer les quatre points níimporte où (sous réserve díavoir une bonne vue dans l’espace).

Remarque : au démarrage les points A,B,C et D, n’apparaissent pas sur les différents plans, pour les voir apparaître il faut cliquer sur le point voulu dans la rubrique ëAffichageí.

Il suffit de choisir dans quel plan on souhaite placer un point, on clique sur le point choisit ( A , par exemple ) et on se reporte dans le plan considéré pour y positionner le point. Par exemple on peut placer les points comme ceci :

image5

image6

Le programme connaît quelque défaut, comme celui de ne pas permettre a líutilisateur de se tromper. Par exemple, si vous voulez placer A dans le plan (X,Y), et que vous le placiez dans le plan (X,Z) par inattention, le point va sortir du cadre et ne sera plus visible. Pour récupérer cette erreur, il suffit de replacer le point dans le bon plan et de sortir (Cliquer sur « Stop ! ») puis ré-entrer.

Une fois les points placés, il suffit de sortir en cliquant sur « Stop ! », les points sont alors automatiquement sauvegardés.

La deuxième étape consiste à faire ce que j’appellerai le squelette du carreau, en d’autres termes à tracer les courbes limites du carreau . Pour cela il suffit de cliquer sur « A,B » si l’on veut dessiner la courbe entre A et B.

image3

 

Cíest toujours le même principe, on choisit dans quel plan on veut placer P1,P2,P3,P4, puis ensuite on affiche la courbe de Bézier obtenue en cliquant sur « Bezier ».

Pour sortir il suffit de cliquer sur « Stop ! » et les modifications seront enregistrées.

Par exemple :

Entre A et B :

image7

Entre A et D :

image8

 

Entre B et C :

image9

Entre C et D :

image10

 

La troisième étape

 permet de faire des modifications, soit de changer les points A,B,C ou D, après avoir tracé les courbes . Il níy a pas vraiment díordre on peut commencer par tracer les courbes limites puis placer les points A,B,C et D.

Il est possible grâce aux barres de défilement ëAZIMUTí et ëELEVATIONí de faire pivoter le squelette , pour le voir sous tous les angles.

Par exemple : AZIMUT : 45∞ et ELEVATION : 45∞

image11

Le même squelette avec ELEVATION : -30∞ et AZIMUT : 40.

image12

La quatrième étape permet le

réglage de la torsioní, pour cela on appuie sur ëCOONSí.

On obtient un premier résultat , un carreau de COONS avec pour limite le squelette mais sans aucune torsion. Avec le squelette précèdent on obtient le carreau suivant :

image13

Il est possible de changer la définition ( le nombre de point ) en activant la troisième barre de défilement.

image14

image15

Et comme précédemment, il est possible de faire varier líAZIMUT et líELEVATION :

Il y a en plus 3 autres boutons, qui permettent de faire les projections sur différents plans :

Par exemple « ProjXY » : on obtient une projection sur le plan (X,Y) :

image16

Donc pour régler la torsion, il suffit de cliquer sur « Torsion A », « Torsion B », « Torsion C » ou encore « Torsion D », suivant le point auquel on veut régler la torsion.

Par exemple on clique sur « Torsion A », et je vais prendre le carreau de base :

image17

Les trois cases indiquent respectivement la torsion en X au point A, puis la torsion en Y au point A, et dernièrement la torsion en Z en A.

Pour sortir, il suffit de taper « Stop ! » et toutes les modifications seront prises en compte.

Pour l’affichage, il suffit de taper sur ëVue !í, même au départ (líaffichage níest pas automatique)

Je vais d’abord augmenter la torsion en X (de A):

image18

La torsion níest visible que dans le plan (X,Y) ; si jíavais diminué X, on aurait vu :

image19

Ensuite je vais augmenter la torsion en Y :

image20

 

On observe que la torsion níest visible que dans le plan (X,Y) , en diminuant la torsion en Y on obtient:

 

image21

En dernièrement en augmentant la torsion en Z, on observe :

image22

Et en diminuant la torsion en Y :

image24 image25

Une fois le carreau terminé, ou bien a tout moment il est possible de sauvegarder le carreau de COONS fait. Il suffit de taper le nom sous lequel on veut l’enregistrer et d’appuyer sur le bouton « Enreg. »

image26

Il est aussi possible de ëChargerí un carreau déjà enregistré et díimprimer au format  » .ps  » un carreau de COONS.

A tout moment il est possible de revenir au premier menu, en tapant ëStop !í, et de modifier les points ou bien les courbes limites sans perdre les données.

Les raccordements

Apres avoir fait (et enregistrer) quelques carreaux de COONS, il est possible de les raccorder. Pour cela on revient a la fenêtre de départ et on choisit le bouton Raccordement (C0,C1,C2) de Carreau de COONSí .

La première étape

consiste à charger le carreau central, celui sur lequel on raccordera les carreaux , on tape le nom (en face de « Charger A ») puis on appuie sur le bouton et on voit alors apparaître le carreau à droite ( sinon cela veut dire que le carreau n’existe pas !)

image27

 

On a toujours les deux barres de défilements ëElevationí et ëAzimutí , ainsi que le bouton ëStop !í qui permet de retourner au menu de départ.

Le bouton « Interpolation » permet díinterpoler le carreau principal grâce au Spline :

  • points de contrôle
  • vecteurs nodaux.

( il faut fermer la fenêtre qui apparaît manuellement )

image28

 

Le bouton « bsurf » trace la Spline a partir des résultats obtenues par le biais de l’interpolation.

(il faut aussi fermer la fenêtre manuellement)

image29

La deuxième étape

consiste à charger les carreaux de raccordement (B,C,D,E), par défaut on a un raccordement C0 le programme le carreau à la position souhaitée, il níest pas nécessaire que le coté de raccordement ait une même courbe limite. (On notera les quatre points du carreau central : a,b,c,d)

Charger B (e,f,g,h) : le coté [g,h] du carreau se fixe sur [a,b], par translation de [g,h] sur [a,b].

Charger C (i,j,k,l) : le coté [i,l] du carreau se fixe sur [b,c], par translation de [i,l] sur [b,c].

 

Charger D (m,n,o,p) : le coté [m,n] du carreau se fixe sur [c,d], par translation de [m,n] sur [c,d].

Charger E (q,r,s,t) : le coté [r,s] du carreau se fixe sur [a,d], par translation de [r,s] sur [a,d].

 

 

Il níest pas nécessaire que les coordonnées de a et b soient les même que g et h, étant donné que le programme procède par translation. Sur líexemple si dessus, jíai chargé cinq fois le même

Carreau ( les quatre courbes limites de ce carreau étant différentes ).

Le bouton ëplein ecraní permet une vue plein écran. (il faut refermer la fenêtre manuellement ).

image30image31

Les boutons « C1 » et « C2 » permettent de faire un raccordement C1 ou C2.Par exemple , un raccordement C0.

image32

Avec un raccordement C1 on obtiendrai :

image33

Et un raccordement C2, donnerait :

image34

Remarques générales :

 

Pour une bonne utilisation de líinterface, il ne faut pas passer díune fenêtre à líautre et toujours sortir avec ëStop !í pour que les modification soient prises en compte.

Dans les cas des boutons íInterpolationí, ëBsurfí et ëPlein Ecraní il faut fermer la fenêtre manuellement avant de revenir à la fenêtre précédente.

Quelques exemples :

 

image35

 

Voici la figure nommée « parachute ».

Le raccordement C0 de 4 figure ëparachuteí sur une figure « parachute »:

image36

La même figure avec 4 raccordements C1 :

image36

Et maintenant avec un raccordement C2 :

image37

image38

image39

image39 image40 image41

Programmation sous Matlab

 

Bezier3.m
 

function [Sortie1,Sortie2,Sortie3]=bezier3(Ptsx,Ptsy,Ptsz);
%nbre est la discretisation choisie
nbre=100
n=length(Ptsx)-1
for l=1:nbre+1
t(l)=(l-1)/nbre;
for i=1:n+1
Px(1,i)=Ptsx(i);
Py(1,i)=Ptsy(i);
Pz(1,i)=Ptsz(i);
end;
 
for k=2:n+1
for i=k:n+1
Px(k,i)=(1-t(l))*Px(k-1,i-1)+t(l)*Px(k-1,i);
Py(k,i)=(1-t(l))*Py(k-1,i-1)+t(l)*Py(k-1,i);
Pz(k,i)=(1-t(l))*Pz(k-1,i-1)+t(l)*Pz(k-1,i);
end;
end;
 
Ptx(l)=Px(n+1,n+1);
Pty(l)=Py(n+1,n+1);
Ptz(l)=Pz(n+1,n+1);
 
end;
 
Sortie1=Ptx;
Sortie2=Pty;
Sortie3=Ptz;
Bsurf.m
 
function [X,Y,Z]=bsurf(x,y,z,U,V,K,L);
 
% Fonction donnant l'ensemble des points Qkl (points de
 la Surface Spline)
% a partir des Pij (points du polyedre de controle)
% et du choix des degres m1 et m2 des B-Splines...
% x,y,z: matrices (n1+1)*(n2+1) des coordonnees des points
 Pij
% U,V: vecteurs nodaux resp.associes aux parametres u,v
% K,L: entiers tels que k=0...K-1 et l=0...L-1
 
n1=size(x,1)-1;
n2=size(x,2)-1;
m1=length(U)-n1-1;
m2=length(V)-n2-1;
 
for ctr1=0:n1
vect1=[x(ctr1+1,:);y(ctr1+1,:);z(ctr1+1,:)];
s=spmak(V,vect1);
 
Vd=V(1);
 
Vf=V(length(V));
 
vs=fnval(s,[Vd:(Vf-Vd)/(L-1):Vf]);
X1(ctr1+1,:)=vs(1,:); 
Y1(ctr1+1,:)=vs(2,:);
Z1(ctr1+1,:)=vs(3,:);
 
end;
 
for ctr2 = 0:L-1
vect2=[X1(:,ctr2+1)';Y1(:,ctr2+1)';Z1(:,ctr2+1)'];
s2=spmak(U,vect2);
 
Ud=U(1);
Uf=U(length(U));
us=fnval(s2,[Ud:(Uf-Ud)/(K-1):Uf]);
 
X2(ctr2+1,:)=us(1,:);
Y2(ctr2+1,:)=us(2,:);
Z2(ctr2+1,:)=us(3,:);
 
end;
X=X2';
Y=Y2';
Z=Z2';
Coons.m
function [Sortie1,Sortie2,Sortie3] = COONS(k,Bx,By,Bz);
%Pour un carreau de TYPE H.
%Cette fonction permet de dessiner un carreau de coons
%a partir des matrices Bx,By,Bz et de deltainv (qui est
%le nombre de pas).
format long
delta = 1/k;
%Les matrices constantes
M=[ -6 6 -3 -3 -0.5 0.5;
15 -15 8 7 1.5 -1;
-10 10 -6 -4 -1.5 0.5;
0 0 0 0 0.5 0;
0 0 1 0 0 0;
1 0 0 0 0 0];
N=[ 120 0 0 0 0 0;
-240 24 0 0 0 0;
150 -36 6 0 0 0;
-30 14 -6 2 0 0;
1 -1 1 -1 1 0;
0 0 0 0 0 1];
L=[1 0 0 0 0 0;
1 1 0 0 0 0;
1 1 1 0 0 0;
1 1 1 1 0 0;
1 1 1 1 1 0;
1 1 1 1 1 1];
I=[0 0 0 0 0 1];
D=[delta^5 0 0 0 0 0;
0 delta^4 0 0 0 0;
0 0 delta^3 0 0 0;
0 0 0 delta^2 0 0;
0 0 0 0 delta 0;
0 0 0 0 0 1];
SxOO=N*D*M*Bx*M'*D'*N';
SyOO=N*D*M*By*M'*D'*N';
SzOO=N*D*M*Bz*M'*D'*N';
%Algorithme de calcul des differences :
Tmpl=inv(L);
Tmpj=inv(L');
for l = 1:k+1
Tmpl=Tmpl*L;
for j = 1:k+1
Tmpj=Tmpj*L';
Px(l,j)=I*Tmpl*SxOO*Tmpj*I';
Py(l,j)=I*Tmpl*SyOO*Tmpj*I';
Pz(l,j)=I*Tmpl*SzOO*Tmpj*I';
end;
Tmpj=inv(L');
end;
Sortie1=Px;
Sortie2=Py;
Sortie3=Pz;
Depart.m
% ******************************************
% * *
% * Programmme compile avec MATLAB 4 *
% * (sous windows) et MATLAB 5 ( sous *
% * unix ). *
% * *
% ******************************************
% * *
% * Declaration : depart *
% * *
% ******************************************
% * *
% * Vesion : 16.06.99 *
% * *
% * *
% ******************************************
% * *
% * ARIAS Frederic : MIM2 *
% * *
% * Projet du MIM10 : Carreaux de COONS *
% * *
% ******************************************
% * *
% * Mise en garde : il est fortement *
% * conseiller de ne pas sauter de fenetre*
% * en fenetre *
% * *
%***************************************************
%* *
%* Ce programme fait appel aux *
%* sous-programme : *
%* *
%* fenetre *
%* index -> plan (2) -> bezier3 *
%* plan1 (2) -> bezier3 *
%* plan2 (2) -> bezier3 *
%* plan3 (2) -> bezier3 *
%* plan4 (2) -> bezier3 *
%* plan5 (2) -> bezier3 *
%* vue3d (2) -> coons *
%* -> torsiona (2) *
%* -> torsionb (2) *
%* -> torsionc (2) *
%* -> torsiond (2) *
%* index2 -> inter -> nenx *
%* -> matrice *
%* -> bsurf -> fnval(1) -> spval(1) *
%* -> ppual(1) *
%* -> spmak(1) *
%* -> coons *
%* vision (en cours) *
%* *
%***************************************************
% (1) : programme non implemente par mes soins ;-)
% (2) : programme TOTALEMENT dependant de index
%
% ETAPE 0 : On explique et on demarre
% REMARQUE :
% 1 : Vous allez vous appercevoir que certaines variables
 contiennent
% les memes renseignements, ce n'est pas une erreur de
 l'utilisateur
% mais cela est destiné :
% - soit a facilite la comprehension du lecteur,
% - soit a facilite la comprehension pour MATLAB.
%
% 2 : Certains aspects techniques sur la creation de fonction
% comme coons, bezier, nenx, bsurf, ne seront pas expliquer
% dans les commentaires.
%
% 3 : Pouquoi une interface graphique ?
% a - Pour exploiter toutes les possibilitées de
 MATLAB.
% b - Pour une creation de carreaux de coons plus RAPIDE
% et plus INTUITIVE.
%
%Definition des quatres points du carreaux:
%
% A = P(0,0) = [X(1) Y(1) Z(1)] = [X(5) Y(5) Z(5)]
% ( remarque : on note P(0,0) un point de l'espace x,y,z
 )
% ( P(0,0) est en fait un vecteur [x y z] )
% B = P(1,0) = [X(2) Y(2) Z(2)]
%
% C = P(1,1) = [X(3) Y(3) Z(3)]
%
% D = P(0,1) = [X(4) Y(4) Z(4)]
%
%Avec pour convention:
%
% B=[ P(0,0) P(0,1) dP(0,0)/du dP(0,1)/du ]
% [ P(1,0) P(1,1) dP(1,0)/du dP(1,1)/du ]
% [dP(0,0)/dw dP(0,1)/dw d^2P(0,0)/dwdu d^2P(0,1)/dwdu
 ] ]
% [dP(1,0)/dw dP(1,1)/dw d^2P(1,0)/dwdu d^2P(1,1)/dwdu
 ] ]
%
% B est en fait une matrice 4*4*3 !
%
% On notera donc B = [ Bx By Bz]
% avec Bx,By,Bz:4x4
%
%Cette fonction redefinie le standard d'une fenetre
%ce n'est pas tres technique mais peu interessant
%donc je ne m'etalerais pas...
%C'est domage de ne pas utiliser les avantage d'une 17
 pouce !
clear all;
screen = get(0, 'ScreenSize');
width = screen(3);
height = screen(4);
if height >= 600
mwwidth = 400; mwheight = 150;
else
mwwidth = 400; mwheight = 150;
end
left = (width-mwwidth)/2;
bottom = height-mwheight-60;
rect = [ left bottom mwwidth mwheight ];
set(0, 'defaultfigureposition',rect);
figure(1)
% bouton poussoir pour la fonction
P1 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [0 100 400 50],... % position du bouton
'string', 'Creation de CARREAU de COONS de TYPE H', ...
 % texte du bouton
'callback', [...
'close(1);'...
'index;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour la fonction
P1 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [0 50 400 50],... % position du bouton
'string', 'Raccordement (C0,C1,C2) de CARREAU de COONS',
 ... % texte du bouton
'callback', [...
'close(1);'...
'index2;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour la fonction
P1 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [0 0 400 50],... % position du bouton
'string', 'Sortir du programme', ... % texte du bouton
'callback', [...
'close(1);'...
]); % fonction, script à appeler ou
% commande à exécuter
Fenetre.m
%Cette fonction redefinie le standard d'une fenetre
%ce n'est pas tres technique mais peu interessant
%donc je ne m'etalerais pas...
%C'est domage de ne pas utiliser les avantage d'une 17
 pouce !
screen = get(0, 'ScreenSize');
width = screen(3);
height = screen(4);
if height >= 600
mwwidth = 770; mwheight = 540;
else
mwwidth = 700; mwheight = 500;
end
left = (width-mwwidth)/2;
bottom = height-mwheight-60;
rect = [ left bottom mwwidth mwheight ];
set(0, 'defaultfigureposition',rect);
Index.m
%On efface toutes les donnees qui sont en memoires
clear all;
%On redefinie le types standart d'une fenetre
fenetre;
%ETAPE1 :On declare toutes les variables globales du programme
 principal
global numero % On numerote la premiere fenetre.
global num % On numerote la deuxieme fenetre.
global num2 % On numerote la troisieme fenetre.
global X % (**) Premiere facon de connaitre les coordonnees
global Y % des points A,B,C,D.
global Z %
global DA % (**) Premiere facon de connaitre les derivees
 aux points
global DB % A,B,C,D.
global DC %
global DD %
global DDA % (**) Premiere facon de connaitre les derivees
 seconde aux points
global DDB % A,B,C,D.
global DDC %
global DDD %
global Xuw % (**) Premiere facon de connaitre la torsion
 au quatres
global Yuw % coins.
global Zuw %
global Xu2 %
global Yu2 %
global Zu2 %
global Xw2 %
global Yw2 %
global Zw2 %
global tX % Ce sont des variables temporaires qui permette
global tY % de definir les derivees aux quatres
global tZ % coins.
global Bx % C'est la deuxieme facon de connaitre les coordonnees
global By % des points A,B,C,D ainsi que leur derivee
 et torsion
global Bz % c'est la synstese de (**)
% C'est en fait la facon dont COONS a range ses informations
% mais elle est lourde pour la creation de graphique sous
% MATLAB
global temp1 % Ceci est l'AZIMUT
global temp2 % Ceci est l'ELEVATION
% Cela permet de voir un objet sous tous les angles !
global AMin % Elevation minimum.
global AMax % Elevation maximum.
global VMin % Azimut minimum.
global VMax % Azimut maximum.
global hAsc3 % On garde en memoire la definition des barre
 de defilement
global VAsc3 % surtout si elle ne sont pas introduite
 dans la fenetre
global hVal3 % principale.
global hAsc4 %
global VAsc4 %
global hVal4 %
global hAsc5 %
global VAsc5 %
global hVal5 %
global X1 % Resultat de la fonction COONS :
global Y1 % cela permet de faire le dessin
global Z1 %
global PXZ % On garde en memoire des boutons qui ne sont
 pas
global PYZ % declare dans la fonction principale.
global PXY % ( Bouton de projection sur les axes de la
% fonction vue3d )
global nom % On garde en memoire des saisies (zones de
 textes)
global nom2 % qui ne sont pas declare dans la fonction
 principale
global nom3 % ( Saisie de charger, imprimer, enregistrer
 de la
% fonction vue3d ).
global pts % On garde en memoire le nombre de discretisation
% pour l'utilisation de la fonction coons .
global temps % Constante pour connaitre le temp de creation
global Temps % d'un carreau.
global ABX
global ABY
global ABZ
global BCX
global BCY
global BCZ
global ADX
global ADY
global ADZ
global CDX
global CDY
global CDZ
%ETAPE 2:On initialise
Temps=0; % On met le chrono à zero
temps=0; %
X=[0 0 1 1]; % C'est le carreau standard
Y=[0 1 1 0]; % A,B,C,D ne sont pas confondus
Z=[0.5 0.5 0.5 0.5]; % et forme un carre dans le plan
 Z=0.5
DA=[0 0; % On prend meme toutes les derives nulles
0 0; % plus simple tu meurt ...
0 0]; %
DB=[0 0; %
0 0; %
0 0]; %
DC=[0 0; %
0 0; %
0 0]; %
DD=[0 0; %
0 0; %
0 0]; %
DDA=[0 0; % On prend meme toutes les derives seconde nulles
0 0; % plus simple tu meurt ...
0 0]; %
DDB=[0 0; %
0 0; %
0 0]; %
DDC=[0 0; %
0 0; %
0 0]; %
DDD=[0 0; %
0 0; %
0 0]; %
Xuw=[0 0; % On continue dans la meme optique pour la creation
 du
0 0]; % carreau standart : plus simple tu ...
Yuw=[0 0; % LA TORSION NULLE !
0 0]; %
Zuw=[0 0; %
0 0]; %
tX=[0 0 0 0 0 0]; % On initialise ceci comme cela, en
 fait c'est
tY=[0 0 0 0 0 0]; % pour faire comprendre a MATLAB 4 que
 ce sont
tZ=[0 0 0 0 0 0]; % des vecteurs lignes
numero=1; % numero de la fenetre principale
num = 2; % numero de la fenetre secondaire
num2 = 3;
VMin = 0; % Azimut minimum
VMax = 180; % Azimut maximum
AMin = -90; % Elevation minimum
AMax = 90; % Elevation maximum
VInit = 45; % Standard
temp1 = 45;
temp2 = 45;
tX=[X(4) 0.2*DD(1,1)+X(4) DDD(1,1)*0.1+0.4*DD(1,1)+X(4)
 DDC(1,1)*0.1+DC(1,1)*0.4+X(3) DC(1,1)*0.2+X(3) X(3)];
tY=[Y(4) 0.2*DD(2,1)+Y(4) DDD(2,1)*0.1+0.4*DD(2,1)+Y(4)
 DDC(2,1)*0.1+DC(2,1)*0.4+Y(3) DC(2,1)*0.2+Y(3) Y(3)];
tZ=[Z(4) 0.2*DD(3,1)+Z(4) DDD(3,1)*0.1+0.4*DD(3,1)+Z(4)
 DDC(3,1)*0.1+DC(3,1)*0.4+Z(3) DC(3,1)*0.2+Z(3) Z(3)];
[CDX,CDY,CDZ]=bezier3(tX,tY,tZ);
tX=[X(2) 0.2*DB(1,2)+X(2) DDB(1,2)*0.1+0.4*DB(1,2)+X(2)
 DDC(1,2)*0.1+DC(1,2)*0.4+X(3) DC(1,2)*0.2+X(3) X(3)];
tY=[Y(2) 0.2*DB(2,2)+Y(2) DDB(2,2)*0.1+0.4*DB(2,2)+Y(2)
 DDC(2,2)*0.1+DC(2,2)*0.4+Y(3) DC(2,2)*0.2+Y(3) Y(3)];
tZ=[Z(2) 0.2*DB(3,2)+Z(2) DDB(3,2)*0.1+0.4*DB(3,2)+Z(2)
 DDC(3,2)*0.1+DC(3,2)*0.4+Z(3) DC(3,2)*0.2+Z(3) Z(3)];
[BCX,BCY,BCZ]=bezier3(tX,tY,tZ);
tX=[X(1) 0.2*DA(1,2)+X(1) DDA(1,2)*0.1+0.4*DA(1,2)+X(1)
 DDD(1,2)*0.1+DD(1,2)*0.4+X(4) DD(1,2)*0.2+X(4) X(4)];
tY=[Y(1) 0.2*DA(2,2)+Y(1) DDA(2,2)*0.1+0.4*DA(2,2)+Y(1)
 DDD(2,2)*0.1+DD(2,2)*0.4+Y(4) DD(2,2)*0.2+Y(4) Y(4)];
tZ=[Z(1) 0.2*DA(3,2)+Z(1) DDA(3,2)*0.1+0.4*DA(3,2)+Z(1)
 DDD(3,2)*0.1+DD(3,2)*0.4+Z(4) DD(3,2)*0.2+Z(4) Z(4)];
[ADX,ADY,ADZ]=bezier3(tX,tY,tZ);
tX=[X(1) 0.2*DA(1,1)+X(1) DDA(1,1)*0.1+0.4*DA(1,1)+X(1)
 DDB(1,1)*0.1+DB(1,1)*0.4+X(2) DB(1,1)*0.2+X(2) X(2)];
tY=[Y(1) 0.2*DA(2,1)+Y(1) DDA(2,1)*0.1+0.4*DA(2,1)+Y(1)
 DDB(2,1)*0.1+DB(2,1)*0.4+Y(2) DB(2,1)*0.2+Y(2) Y(2)];
tZ=[Z(1) 0.2*DA(3,1)+Z(1) DDA(3,1)*0.1+0.4*DA(3,1)+Z(1)
 DDB(3,1)*0.1+DB(3,1)*0.4+Z(2) DB(3,1)*0.2+Z(2) Z(2)];
[ABX,ABY,ABZ]=bezier3(tX,tY,tZ);
hfig = figure(numero); % Fenetre principale
%ETAPE 3 : On definie les fonctions de la fenetre
figure(numero) % On ouvre la fenetre
title('Dans le plan X,Y,Z') % On nomme la fenetre
view(temp1,temp2); % On positionne son angle de vue
hold on % On le previent que l'on va
% dessiner sur la fenetre et
% que c'est pas la peine d'effacer
% au fur et a mesure ...
plot3(ABX,ABY,ABZ);
plot3(ADX,ADY,ADZ);
plot3(CDX,CDY,CDZ);
plot3(BCX,BCY,BCZ);
xlabel('x'); % On nomme les axes .
ylabel('y'); %
zlabel('z'); %
text(X(1),Y(1),Z(1),'A'); % On nomme les points
text(X(2),Y(2),Z(2),'B'); %
text(X(3),Y(3),Z(3),'C'); %
text(X(4),Y(4),Z(4),'D'); %
hold off % On s'arrete de dessiner
% ETAPE 4 : création de barre de défilement
 (ascenseur ou slider)
% CETTE PREMIERE BARRE VA PERMETTRE DE REGLER L'AZIMUT
hAsc = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'slider', ... % style du bouton
'position', [25 0 145 25],... % position du bouton
'min', VMin,... % valeur de la borne inférieure
'max', VMax,... % valeur de la borne supérieure
'value', VInit, ... % valeur initiale
'callback', [...
% actions à réaliser lors du mouvement
'VAsc = num2str(get(hAsc,''value''));'...
'set(hVal,''string'',VAsc);'...
'figure(numero);'...
'temp1 = round(get(hAsc,''value''));'...
'view(temp1,temp2);'...
]);
% affichage de la valeur courante
hVal = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [25 25 145 15]); % position du bouton
% affichage de la valeur minimale
TxtMin = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [25 41 145 15],... % position du bouton
'string','AZIMUT') ;
% affichage de la valeur minimale
TxtMin = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [0 0 25 25],... % position du bouton
'string',num2str(VMin));
% affichage de la valeur maximale
TxtMax = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [170 0 25 25],... % position du bouton
'string',num2str(VMax));
% FIN POUR LA PREMIERE BARRE
% CETTE DEUXIEME BARRE VA PERMETTRE DE REGLER L'ELEVATION
hAsc2 = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'slider', ... % style du bouton
'position', [225 0 145 25],... % position du bouton
'min', AMin,... % valeur de la borne inférieure
'max', AMax,... % valeur de la borne supérieure
'value', VInit, ... % valeur initiale
'callback', [... % actions à réaliser lors
 du mouvement
'VAsc2 = num2str(get(hAsc2,''value''));'...
'set(hVal2,''string'',VAsc2);'...
'temp2 = round(get(hAsc2,''value''));'...
'figure(numero);'...
'title(''Dans le plan X,Y,Z'');'...
'view(temp1,temp2);'...
]);
% affichage de la valeur courante
hVal2 = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [225 25 145 15]); % position du bouton
% affichage de la valeur minimale
TxtMin2 = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [225 41 145 15],... % position du bouton
'string','ELEVATION');
% affichage de la valeur minimale
TxtMin2 = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [200 0 25 25],... % position du bouton
'string',num2str(AMin));
% affichage de la valeur maximale
TxtMax2 = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [370 0 25 25],... % position du bouton
'string',num2str(AMax));
% FIN POUR LA DEUXIEME BARRE
% Initialisations de la deuxieme barre
set(hVal2,'string',num2str(VInit));
% Initialisations de la premiere barre
set(hVal,'string',num2str(VInit));
% ETAPE 5 : création de bouton poussoir
% bouton poussoir pour la fonction 'plan'
BP1 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [400 0 100 30],... % position du bouton
'string', 'Placer A,B,C,D', ... % texte du bouton
'callback', [...
'plan;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour la fonction 'vue3d'
BP4 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [510 0 70 30],... % position du bouton
'string', 'COONS', ... % texte du bouton
'callback', 'vue3d;'); % fonction, script à appeler
 ou
% commande à exécuter
% bouton poussoir pour la fonction 'planab'
BP5 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [590 0 30 30],... % position du bouton
'string', 'A,B', ... % texte du bouton
'callback', [...
'plan2;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour la fonction 'planad'
BP6 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [620 0 30 30],... % position du bouton
'string', 'A,D', ... % texte du bouton
'callback', [...
'plan3;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour la fonction 'planbc'
BP7 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [650 0 30 30],... % position du bouton
'string', 'B,C', ... % texte du bouton
'callback', [...
'plan4;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour la fonction 'plancd'
BP8 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [680 0 30 30],... % position du bouton
'string', 'C,D', ... % texte du bouton
'callback', [...
'plan5;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour la fonction index2
BP10 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [720 0 40 30],... % position du bouton
'string', 'Stop !', ... % texte du bouton
'callback', [...
'close(numero);'...
'Temps,'...
'depart;'...
]); % fonction, script à appeler ou
% commande à exécuter
Index2.m
%Utilisation des fonctions :
%
% coons
% interpo
% bsurf
clear all;
fenetre;
global num
global num2
global temp1
global temp2
global nom3
num=1;
num2=2;
temp1=45;
temp2=45;
figure(num)
hfig = figure(num);
VInit = 45;
points=20;
%
% TRAITEMENT DU CARREAU PRINCIPAL : 'A'
%
%
% affichage de la valeur minimale
TxtMin = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [0 401 300 20],... % position du bouton
'string','Chargement du carreau central');
% bouton poussoir pour la fonction
P1 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [0 380 70 20],... % position du bouton
'string', 'Charger A', ... % texte du bouton
'callback', [...
'Nom=get(nom1,''string'');'...
'load(Nom);'...
'AX=Bx;'...
'AY=By;'...
'AZ=Bz;'...
'[XA,YA,ZA]=coons(points,Bx,By,Bz);'...
'clear figure(num);'...
'subplot(1,2,2);'...
'figure(num);'...
'mesh(XA,YA,ZA),'...
'title(''Dans le plan X,Y,Z'');'...
'view(temp1,temp2);'...
'xlabel(''x'');'...
'ylabel(''y'');'...
'zlabel(''z'');'...
'text(X(1),Y(1),Z(1),''A'');'...
'text(X(2),Y(2),Z(2),''B'');'...
'text(X(3),Y(3),Z(3),''C'');'...
'text(X(4),Y(4),Z(4),''D'');'...
]); % fonction, script à appeler ou
% commande à exécuter
nom1 = uicontrol(gcf, ... % handle sur fenêtre graphique
'style', 'edit', ... % style du bouton
'position', [80 380 100 20], ... % position du bouton
'string', '' , ... % texte du bouton
'Max', 1, ... % zone multi-lignes
'callback', [... % stockage du prénom
'varnom = get(nom1,''string'');'...
]);
% bouton poussoir pour imprimer au format ps un carreau
 de coons
P12 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [0 350 70 20],... % position du bouton
'string', 'Impri.', ... % texte du bouton
'callback', [...
'Nom=get(nom3,''string'');'...
'print(Nom);'...
]); % fonction, script à appeler ou
% commande à exécuter
nom3 = uicontrol(gcf, ... % handle sur fenêtre graphique
'style', 'edit', ... % style du bouton
'position', [80 350 100 20], ... % position du bouton
'string', '' , ... % texte du bouton
'Max', 1, ... % zone multi-lignes
'callback', [... % stockage du prénom
'varnom = get(nom3,''string'');'...
]);
%
% TRAITEMENT DU CARREAU 'B'
%
%
% affichage de la valeur minimale
TxtMin = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [0 521 300 19],... % position du bouton
'string','Chargement des carreaux');
% bouton poussoir pour la fonction
P1 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [0 500 70 20],... % position du bouton
'string', 'Charger B', ... % texte du bouton
'callback', [...
'Nom=get(nom2,''string'');'...
'load(Nom);'...
...
'BX=Bx;'...
'BY=By;'...
'BZ=Bz;'...
...
'distX=X(4)-X(1);'...
'distY=Y(4)-Y(1);'...
'distZ=Z(4)-Z(1);'...
...
'BX(1,1)=BX(1,1)-distX;'...
...
'BY(1,1)=BY(1,1)-distY;'...
...
'BZ(1,1)=BZ(1,1)-distZ;'...
...
'BX(2,1)=BX(2,1)-distX;'...
...
'BY(2,1)=BY(2,1)-distY;'...
...
'BZ(2,1)=BZ(2,1)-distZ;'...
...
'BX(:,2)=AX(:,1);'...
'BY(:,2)=AY(:,1);'...
'BZ(:,2)=AZ(:,1);'...
...
'[XB,YB,ZB]=coons(points,BX,BY,BZ);'...
'figure(num);'...
'subplot(1,2,2);'...
'hold on;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'hold off;'...
'text(BX(1,1),BY(1,1),BZ(1,1),''E'');'...
'text(BX(2,1),BY(2,1),BZ(2,1),''F'');'...
'text(BX(2,2),BY(2,2),BZ(2,2),''G'');'...
'text(BX(1,2),BY(1,2),BZ(1,2),''H'');'...
]); % fonction, script à appeler ou
% commande à exécuter
nom2 = uicontrol(gcf, ... % handle sur fenêtre graphique
'style', 'edit', ... % style du bouton
'position', [80 500 100 20], ... % position du bouton
'string', '' , ... % texte du bouton
'Max', 1, ... % zone multi-lignes
'callback', [... % stockage du prénom
'varnom = get(nom2,''string'');'...
]);
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [190 500 20 20],... % position du bouton
'string', 'C2', ... % texte du bouton
'callback', [...
'BX(:,4)=AX(:,3);'...
'BY(:,4)=AY(:,3);'...
'BZ(:,4)=AZ(:,3);'...
...
'BX(:,6)=AX(:,5);'...
'BY(:,6)=AY(:,5);'...
'BZ(:,6)=AZ(:,5);'...
...
'[XB,YB,ZB]=coons(points,BX,BY,BZ);'...
'clear figure(num);'...
'figure(num);'...
'subplot(1,2,2);'...
'mesh(XA,YA,ZA);'...
'hold on;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [220 500 20 20],... % position du bouton
'string', 'C1', ... % texte du bouton
'callback', [...
'BX(:,4)=AX(:,3);'...
'BY(:,4)=AY(:,3);'...
'BZ(:,4)=AZ(:,3);'...
...
'[XB,YB,ZB]=coons(points,BX,BY,BZ);'...
'clear figure(num);'...
'subplot(1,2,2);'...
'figure(num);'...
'mesh(XA,YA,ZA);'...
'hold on;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [250 500 50 20],... % position du bouton
'string', 'Effacer', ... % texte du bouton
'callback', [...
'clear XB;'...
'clear YB;'...
'clear YB;'...
'subplot(1,2,2);'...
'figure(num);'...
'mesh(XA,YA,ZA);'...
'hold on;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
%
% TRAITEMENT DU CARREAU 'C'
%
%
% bouton poussoir pour la fonction
P1 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [0 480 70 20],... % position du bouton
'string', 'Charger C', ... % texte du bouton
'callback', [...
'Nom=get(nom3,''string'');'...
'load(Nom);'...
...
'CX=Bx;'...
'CY=By;'...
'CZ=Bz;'...
...
'distX=X(2)-X(1);'...
'distY=Y(2)-Y(1);'...
'distZ=Z(2)-Z(1);'...
...
'CX(1,:)=AX(2,:);'...
'CX(2,1)=CX(2,1)+distX;'...
'CY(1,:)=AY(2,:);'...
'CY(2,1)=CY(2,1)+distY;'...
'CZ(1,:)=AZ(2,:);'...
'CZ(2,1)=CZ(2,1)+distZ;'...
...
'CX(2,2)=CX(2,2)+distX;'...
...
'CY(2,2)=CY(2,2)+distY;'...
...
'CZ(2,2)=CZ(2,2)+distZ;'...
...
'[XC,YC,ZC]=coons(points,CX,CY,CZ);'...
'clear figure(num);'...
'figure(num);'...
'subplot(1,2,2);'...
'mesh(XA,YA,ZA);'...
'hold on;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'hold off;'...
'text(CX(1,1),CY(1,1),CZ(1,1),''I'');'...
'text(CX(2,1),CY(2,1),CZ(2,1),''J'');'...
'text(CX(2,2),CY(2,2),CZ(2,2),''K'');'...
'text(CX(1,2),CY(1,2),CZ(1,2),''L'');'...
]); % fonction, script à appeler ou
% commande à exécuter
nom3 = uicontrol(gcf, ... % handle sur fenêtre graphique
'style', 'edit', ... % style du bouton
'position', [80 480 100 20], ... % position du bouton
'string', '' , ... % texte du bouton
'Max', 1, ... % zone multi-lignes
'callback', [... % stockage du prénom
'varnom = get(nom3,''string'');'...
]);
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [190 480 20 20],... % position du bouton
'string', 'C2', ... % texte du bouton
'callback', [...
'CX(3,:)=AX(4,:);'...
'CY(3,:)=AY(4,:);'...
'CZ(3,:)=AZ(4,:);'...
...
'CX(5,:)=AX(6,:);'...
'CY(5,:)=AY(6,:);'...
'CZ(5,:)=AZ(6,:);'...
...
'[XC,YC,ZC]=coons(points,CX,CY,CZ);'...
'clear figure(num);'...
'subplot(1,2,2);'...
'figure(num);'...
'mesh(XA,YA,ZA);'...
'hold on;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [220 480 20 20],... % position du bouton
'string', 'C1', ... % texte du bouton
'callback', [...
'CX(3,:)=AX(4,:);'...
'CY(3,:)=AY(4,:);'...
'CZ(3,:)=AZ(4,:);'...
...
'[XC,YC,ZC]=coons(points,CX,CY,CZ);'...
'clear figure(num);'...
'figure(num);'...
'subplot(1,2,2);'...
'mesh(XA,YA,ZA);'...
'hold on;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [250 480 50 20],... % position du bouton
'string', 'Effacer', ... % texte du bouton
'callback', [...
'clear XC;'...
'clear YC;'...
'clear ZC;'...
'subplot(1,2,2);'...
'figure(num);'...
'mesh(XA,YA,ZA);'...
'hold on;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
%
% TRAITEMENT DU CARREAU 'D'
%
%
% bouton poussoir pour la fonction
P1 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [0 460 70 20],... % position du bouton
'string', 'Charger D', ... % texte du bouton
'callback', [...
'Nom=get(nom4,''string'');'...
'load(Nom);'...
...
'DX=Bx;'...
'DY=By;'...
'DZ=Bz;'...
...
'distX=X(4)-X(1);'...
'distY=Y(4)-Y(1);'...
'distZ=Z(4)-Z(1);'...
...
'DX(1,2)=DX(1,2)+distX;'...
'DY(1,2)=DY(1,2)+distY;'...
'DZ(1,2)=DZ(1,2)+distZ;'...
'DX(2,2)=DX(2,2)+distX;'...
'DY(2,2)=DY(2,2)+distY;'...
'DZ(2,2)=DZ(2,2)+distZ;'...
...
'DX(:,1)=AX(:,2);'...
...
'DY(:,1)=AY(:,2);'...
...
'DZ(:,1)=AZ(:,2);'...
...
'[XD,YD,ZD]=coons(points,DX,DY,DZ);'...
'clear figure(num);'...
'figure(num);'...
'subplot(1,2,2);'...
'mesh(XA,YA,ZA);'...
'hold on;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'hold off;'...
'text(DX(1,1),DY(1,1),DZ(1,1),''M'');'...
'text(DX(2,1),DY(2,1),DZ(2,1),''N'');'...
'text(DX(2,2),DY(2,2),DZ(2,2),''O'');'...
'text(DX(1,2),DY(1,2),DZ(1,2),''P'');'...
]); % fonction, script à appeler ou
% commande à exécuter
nom4 = uicontrol(gcf, ... % handle sur fenêtre graphique
'style', 'edit', ... % style du bouton
'position', [80 460 100 20], ... % position du bouton
'string', '' , ... % texte du bouton
'Max', 1, ... % zone multi-lignes
'callback', [... % stockage du prénom
'varnom = get(nom4,''string'');'...
]);
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [220 460 20 20],... % position du bouton
'string', 'C1', ... % texte du bouton
'callback', [...
'DX(:,3)=AX(:,4);'...
'DY(:,3)=AY(:,4);'...
'DZ(:,3)=AZ(:,4);'...
...
'[XD,YD,ZD]=coons(points,DX,DY,DZ);'...
'clear figure(num);'...
'figure(num);'...
'subplot(1,2,2);'...
'mesh(XA,YA,ZA);'...
'hold on;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [190 460 20 20],... % position du bouton
'string', 'C2', ... % texte du bouton
'callback', [...
'DX(:,3)=AX(:,4);'...
'DY(:,3)=AY(:,4);'...
'DZ(:,3)=AZ(:,4);'...
...
'DX(:,5)=AX(:,6);'...
'DY(:,5)=AY(:,6);'...
'DZ(:,5)=AZ(:,6);'...
...
'[XD,YD,ZD]=coons(points,DX,DY,DZ);'...
'clear figure(num);'...
'figure(num);'...
'subplot(1,2,2);'...
'mesh(XA,YA,ZA);'...
'hold on;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [250 460 50 20],... % position du bouton
'string', 'Effacer', ... % texte du bouton
'callback', [...
'clear XD;'...
'clear YD;'...
'clear ZD;'...
'subplot(1,2,2);'...
'figure(num);'...
'mesh(XA,YA,ZA);'...
'hold on;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
%
% TRAITEMENT DU CARREAU 'E'
%
%
% bouton poussoir pour la fonction
P1 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [0 440 70 20],... % position du bouton
'string', 'Charger E', ... % texte du bouton
'callback', [...
'Nom=get(nom5,''string'');'...
'load(Nom);'...
...
'EX=Bx;'...
'EY=By;'...
'EZ=Bz;'...
...
'distX=X(2)-X(1);'...
'distY=Y(2)-Y(1);'...
'distZ=Z(2)-Z(1);'...
...
'EX(1,1)=EX(1,1)-distX;'...
'EY(1,1)=EY(1,1)-distY;'...
'EZ(1,1)=EZ(1,1)-distZ;'...
'EX(1,2)=EX(1,2)-distX;'...
'EY(1,2)=EY(1,2)-distY;'...
'EZ(1,2)=EZ(1,2)-distZ;'...
...
'EX(2,:)=AX(1,:);'...
'EY(2,:)=AY(1,:);'...
'EZ(2,:)=AZ(1,:);'...
...
'[XE,YE,ZE]=coons(points,EX,EY,EZ);'...
'clear figure(num);'...
'figure(num);'...
'subplot(1,2,2);'...
'mesh(XA,YA,ZA);'...
'hold on;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
nom5 = uicontrol(gcf, ... % handle sur fenêtre graphique
'style', 'edit', ... % style du bouton
'position', [80 440 100 20], ... % position du bouton
'string', '' , ... % texte du bouton
'Max', 1, ... % zone multi-lignes
'callback', [... % stockage du prénom
'varnom = get(nom5,''string'');'...
]);
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [220 440 20 20],... % position du bouton
'string', 'C1', ... % texte du bouton
'callback', [...
'EX(4,:)=AX(3,:);'...
'EY(4,:)=AY(3,:);'...
'EZ(4,:)=AZ(3,:);'...
...
'[XE,YE,ZE]=coons(points,EX,EY,EZ);'...
'clear figure(num);'...
'figure(num);'...
'subplot(1,2,2);'...
'mesh(XA,YA,ZA);'...
'hold on;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [190 440 20 20],... % position du bouton
'string', 'C2', ... % texte du bouton
'callback', [...
'EX(6,:)=AX(5,:);'...
'EY(6,:)=AY(5,:);'...
'EZ(6,:)=AZ(5,:);'...
...
'[XE,YE,ZE]=coons(points,EX,EY,EZ);'...
'clear figure(num);'...
'figure(num);'...
'subplot(1,2,2);'...
'mesh(XA,YA,ZA);'...
'hold on;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [250 440 50 20],... % position du bouton
'string', 'Effacer', ... % texte du bouton
'callback', [...
'clear XE;'...
'clear YE;'...
'clear ZE;'...
'subplot(1,2,2);'...
'figure(num);'...
'mesh(XA,YA,ZA);'...
'hold on;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
%
% Les autres fonctions
%
%
%
% STOP
%
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [0 140 100 30],... % position du bouton
'string', 'Stop !', ... % texte du bouton
'callback', [...
'close(num);'...
'depart;'...
]); % fonction, script à appeler ou
% commande à exécuter
%
% Interpolation
%
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [0 180 100 30],... % position du bouton
'string', 'Interpolation', ... % texte du bouton
'callback', [...
'[X2,Y2,Z2,U,V]=inter(XA,YA,ZA,2,2);'...
'figure(2);'...
'mesh(X2,Y2,Z2);'...
'xlabel(''x'');'...
'ylabel(''y'');'...
'zlabel(''z'');'...
'title(''On cherche les points de controle a l aide de
 la fonction INTERPO'');'...
]); % fonction, script à appeler ou
% commande à exécuter
%
% bsurf
%
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [0 220 100 30],... % position du bouton
'string', 'bsurf', ... % texte du bouton
'callback', [...
'[X3,Y3,Z3]=bsurf(X2,Y2,Z2,U,V,101,101);'...
'figure(2);'...
'mesh(X3,Y3,Z3);'...
'xlabel(''x'');'...
'ylabel(''y'');'...
'zlabel(''z'');'...
'title(''On trace la spline a l aide de la fonction BSURF'')'...
]); % fonction, script à appeler ou
% commande à exécuter
%
% Plein ecran
%
% bouton poussoir pour la fonction
P9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [0 260 100 30],... % position du bouton
'string', 'Plein ecran', ... % texte du bouton
'callback', [...
'figure(num2);'...
'hold on;'...
'if (exist(''XA'')==1),'...
'mesh(XA,YA,ZA);'...
'end;'...
'if (exist(''XB'')==1),'...
'mesh(XB,YB,ZB);'...
'end;'...
'if (exist(''XC'')==1),'...
'mesh(XC,YC,ZC);'...
'end;'...
'if (exist(''XD'')==1),'...
'mesh(XD,YD,ZD);'...
'end;'...
'if (exist(''XE'')==1),'...
'mesh(XE,YE,ZE);'...
'end;'...
'hold off;'...
'view(temp1,temp2);'...
'xlabel(''x'');'...
'ylabel(''y'');'...
'zlabel(''z'');'...
'title(''Dans le plan X,Y,Z'')'...
]); % fonction, script à appeler ou
% commande à exécuter
%
% Barre de defilement
%
VMin = 0;
VMax = 180;
AMin = -90;
AMax = 90;
VInit = 45;
temp1 = 45;
temp2 = 45;
hAsc = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'slider', ... % style du bouton
'position', [20 0 150 25],... % position du bouton
'min', VMin,... % valeur de la borne inférieure
'max', VMax,... % valeur de la borne supérieure
'value', VInit, ... % valeur initiale
'callback', [... % actions à réaliser lors
 du mouvement
'VAsc = num2str(get(hAsc,''value''));'...
'set(hVal,''string'',VAsc);'...
'clear figure(num);'...
'figure(num);'...
'temp1 = round(get(hAsc,''value''));'...
'title(''Dans le plan X,Y,Z'');'...
'view(temp1,temp2);'...
'xlabel(''x'');'...
'ylabel(''y'');'...
'zlabel(''z'');'...
]);
% affichage de la valeur minimale
TxtMin = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [20 41 150 20],... % position du bouton
'string','Azimut');
% affichage de la valeur
hVal = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [20 25 150 15]); % position du bouton
% affichage de la valeur minimale
TxtMin = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [0 0 20 25],... % position du bouton
'string',num2str(VMin));
% affichage de la valeur maximale
TxtMax = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [170 0 20 25],... % position du bouton
'string',num2str(VMax));
%
% Barre de defilement
%
hAsc2 = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'slider', ... % style du bouton
'position', [20 70 150 25],... % position du bouton
'min', AMin,... % valeur de la borne inférieure
'max', AMax,... % valeur de la borne supérieure
'value', VInit, ... % valeur initiale
'callback', [... % actions à réaliser lors
 du mouvement
'VAsc2 = num2str(get(hAsc2,''value''));'...
'set(hVal2,''string'',VAsc2);'...
'temp2 = round(get(hAsc2,''value''));'...
'figure(num);'...
'title(''Dans le plan X,Y,Z'');'...
'view(temp1,temp2);'...
'xlabel(''x'');'...
'ylabel(''y'');'...
'zlabel(''z'');'...
]);
% affichage de la valeur minimale
TxtMin = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [20 111 150 20],... % position du bouton
'string','Elevation');
% affichage de la valeur
hVal2 = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [20 95 150 15]); % position du bouton
% affichage de la valeur minimale
TxtMin2 = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [0 70 20 25],... % position du bouton
'string',num2str(AMin));
% affichage de la valeur maximale
TxtMax2 = uicontrol(hfig, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [170 70 20 25],... % position du bouton
'string',num2str(AMax));
% Initialisations
set(hVal2,'string',num2str(VInit));
% Initialisations
set(hVal,'string',num2str(VInit));
Inter.m
function [Sortie1,Sortie2,Sortie3,Sortie4,Sortie5] = inter(Qx,Qy,Qz,p,q);
%fonction d'interpolation :
%cette fonction recherche la surface spline d'interpolation.
%Cela retourne les points de controle, ainsi que les vecteurs
 nodaux
[m,n]=size(Qx);
%On cherche U barre
for l = 1:n
distu(1,l)=0;
for i = 2:m
courant=sqrt((Qx(i,l)-Qx(i-1,l))^2+(Qy(i,l)-Qy(i-1,l))^2+(Qz(i,l)-Qz(i-1,l))^2);
distu(i,l)=courant+distu(i-1,l);
end;
for i = 1:m
Ut(i,l)=distu(i,l)/distu(m,l);
end;
end;
for i = 1:m
Ub(i)=Ut(i,1);
for l = 2:n
Ub(i) = Ub(i)+Ut(i,l);
end;
Ub(i)=Ub(i)/(m+1);
end;
%On cherche V barre
for l = 1:m
distv(1,l)=0;
for i = 2:n
courant=sqrt((Qx(l,i)-Qx(l,i-1))^2+(Qy(l,i)-Qy(l,i-1))^2+(Qz(l,i)-Qz(l,i-1))^2);
distv(i,l)=courant+distv(i-1,l);
end;
for i = 1:n
Vt(i,l)=distv(i,l)/distv(n,l);
end;
end;
for i = 1:n
Vb(i)=Vt(i,1);
for l = 2:m
Vb(i) = Vb(i)+Vt(i,l);
end;
Vb(i)=Vb(i)/(n+1);
end;
%On cherche U:
for i = 1:p
U(i)=0;
end;
for i = m+1:m+p
U(i)=1;
end;
for i = p+1:m
U(i)=Ub(i-p);
for j = 1:p-1
U(i)=U(i)+Ub(i+j-p);
end
U(i)=U(i)/p;
end;
%On cherche V:
for i = 1:q
V(i)=0;
end;
for i = n+1:n+q
V(i)=1;
end;
for i = q+1:n
V(i)=Vb(i-q);
for j = 1:q-1
V(i)=V(i)+Vb(i+j-q);
end;
V(i)=V(i)/q;
end;
Temp=matrice(p,m,U,Ub,1);
for l = 1:n
Tx(:,l)=Temp\Qx(:,l);
Ty(:,l)=Temp\Qy(:,l);
Tz(:,l)=Temp\Qz(:,l);
end;
Temp=matrice(q,n,V,Vb,1);
for l = 1:m
Px(:,l)=Temp\Tx(l,:)';
Py(:,l)=Temp\Ty(l,:)';
Pz(:,l)=Temp\Tz(l,:)';
end;
Sortie1=Px;
Sortie2=Py;
Sortie3=Pz;
Sortie4=U;
Sortie5=V;
Matrice.m
function result=matrice(p,n,vect,X,sens)
if sens==1
for j=1:length(X)
for i=1:n
temp(j,i)=nenx(p,i,vect,X(j));
end;
end;
else
for j=1:length(X)
for i=1:n
temp(i,j)=nenx(p,i,vect,X(j));
end;
end;
end;
result=temp;
Nenx.m
function result=nenx(m,i,vect,x)
if m == 1
%spline de base
if (vect(i) <= x)&(x <= vect(i+1))
Som=1;
else
Som=0;
end;
else
%multiplicite maximale
if vect(i+m)==vect(i+1)
if (vect(i) <= x)&(x <= vect(i+m))
Som=((x-vect(i))^(m-1))/((vect(i+m)-vect(i))^(m-1));
else
Som=0;
end;
else
%multiplicite maximale
if vect(i+m-1)==vect(i)
if (vect(i) <= x)&(x <= vect(i+m))
Som=((vect(i+m)-x)^(m-1))/((vect(i+m)-vect(i))^(m-1));
else
Som=0;
end;
else
%formule de reccurence
Temp1=nenx(m-1,i,vect,x);
Temp2=nenx(m-1,i+1,vect,x);
Som=((x-vect(i))*Temp1)/(vect(i+m-1)-vect(i))+(vect(i+m)-x)*Temp2/(vect(i+m)-vect(i+1));
end;
end;
end;
end;
result=Som;
Plan.m
% ********************
% * *
% * Avertissemment *
% * *
% ********************
%
%Cette fonction depend TOTALEMENT de la fonction 'index'
%
global temps
global Temps
temps=cputime; %le temp present !
global numero
global num % On declare les variables globales
% que l'on va utiliser ou modifier
global X % ( elles doivent etre normalement
global Y % declarer dans la fonction principale )
global Z %
global ABX
global ABY
global ABZ
global BCX
global BCY
global BCZ
global ADX
global ADY
global ADZ
global CDX
global CDY
global CDZ
%On place les points dans le plan (X,Y)
figure(num) % Ouverte de la fenetre secondaire
subplot(2,2,1);
hold on
axis([0 1 0 1 ]);
title('Dans le plan X,Y')
hold off
% affichage
TxtMin = uicontrol(gcf, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [501 21 79 20],... % position du bouton
'string','dans (X,Y)');
% bouton poussoir pour placer A:
BP1 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [500 0 20 20],... % position du bouton
'string', 'A', ... % texte du bouton
'callback', [...
'figure(num);'...
'subplot(2,2,1);'...
'hold on;'...
'[X(1),Y(1)]=ginput(1);'...
'plot(X(1),Y(1),''r+'');'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour placer B
BP2 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [520 0 20 20],... % position du bouton
'string', 'B', ... % texte du bouton
'callback', [...
'figure(num);'...
'subplot(2,2,1);'...
'hold on;'...
'[X(2),Y(2)]=ginput(1);'...
'plot(X(2),Y(2),''r+'');'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour placer C
BP3 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [540 0 20 20],... % position du bouton
'string', 'C', ... % texte du bouton
'callback', [...
'figure(num);'...
'subplot(2,2,1);'...
'hold on;'...
'[X(3),Y(3)]=ginput(1);'...
'plot(X(3),Y(3),''r+'');'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour placer D
BP4 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [560 0 20 20],... % position du bouton
'string', 'D', ... % texte du bouton
'callback', [...
'figure(num);'...
'subplot(2,2,1);'...
'hold on;'...
'[X(4),Y(4)]=ginput(1);'...
'plot(X(4),Y(4),''r+'');'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% affichage
TxtMin = uicontrol(gcf, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [680 21 80 20],... % position du bouton
'string','Affichage');
% bouton poussoir pour afficher A
BP5 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [680 0 20 20],... % position du bouton
'string', 'A', ... % texte du bouton
'callback', [...
'figure(num);'...
'subplot(2,2,1);'...
'hold on;'...
'plot(X(1),Y(1),''yo'');'...
'text(X(1),Y(1),''A'');'...
'hold off;'...
'subplot(2,2,2);'...
'hold on;'...
'plot(X(1),Z(1),''yo'');'...
'text(X(1),Z(1),''A'');'...
'hold off;'...
'subplot(2,2,3);'...
'hold on;'...
'plot(Y(1),Z(1),''yo'');'...
'text(Y(1),Z(1),''A'');'...
'hold off;'...
'subplot(2,2,4);'...
'hold on;'...
'plot3(X(1),Y(1),Z(1),''yo'');'...
'text(X(1),Y(1),Z(1),''A'');'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour afficher B
BP6 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [700 0 20 20],... % position du bouton
'string', 'B', ... % texte du bouton
'callback', [...
'figure(num);'...
'subplot(2,2,1);'...
'hold on;'...
'plot(X(2),Y(2),''yo'');'...
'text(X(2),Y(2),''B'');'...
'hold off;'...
'subplot(2,2,2);'...
'hold on;'...
'plot(X(2),Z(2),''yo'');'...
'text(X(2),Z(2),''B'');'...
'hold off;'...
'subplot(2,2,3);'...
'hold on;'...
'plot(Y(2),Z(2),''yo'');'...
'text(Y(2),Z(2),''B'');'...
'hold off;'...
'subplot(2,2,4);'...
'hold on;'...
'plot3(X(2),Y(2),Z(2),''yo'');'...
'text(X(2),Y(2),Z(2),''B'');'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour afficher C
BP7 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [720 0 20 20],... % position du bouton
'string', 'C', ... % texte du bouton
'callback', [...
'figure(num);'...
'subplot(2,2,1);'...
'hold on;'...
'plot(X(3),Y(3),''yo'');'...
'text(X(3),Y(3),''C'');'...
'hold off;'...
'subplot(2,2,2);'...
'hold on;'...
'plot(X(3),Z(3),''yo'');'...
'text(X(3),Z(3),''C'');'...
'hold off;'...
'subplot(2,2,3);'...
'hold on;'...
'plot(Y(3),Z(3),''yo'');'...
'text(Y(3),Z(3),''C'');'...
'hold off;'...
'subplot(2,2,4);'...
'hold on;'...
'plot3(X(3),Y(3),Z(3),''yo'');'...
'text(X(3),Y(3),Z(3),''C'');'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour afficher D
BP8 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [740 0 20 20],... % position du bouton
'string', 'D', ... % texte du bouton
'callback', [...
'figure(num);'....
'subplot(2,2,1);'...
'hold on;'...
'plot(X(4),Y(4),''yo'');'...
'text(X(4),Y(4),''D'');'...
'hold off;'...
'subplot(2,2,2);'...
'hold on;'...
'plot(X(4),Z(4),''yo'');'...
'text(X(4),Z(4),''D'');'...
'hold off;'...
'subplot(2,2,3);'...
'hold on;'...
'plot(Y(4),Z(4),''yo'');'...
'text(Y(4),Z(4),''D'');'...
'hold off;'...
'subplot(2,2,4);'...
'hold on;'...
'plot3(X(4),Y(4),Z(4),''yo'');'...
'text(X(4),Y(4),Z(4),''D'');'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour fermer la fenetre et
% refaire une initialisation
BP9 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [720 490 40 30],... % position du bouton
'string', 'Stop!', ... % texte du bouton
'callback', [...
'close(num);'...
'tX=[X(4) 0.2*DD(1,1)+X(4) DDD(1,1)*0.1+0.4*DD(1,1)+X(4)
 DDC(1,1)*0.1+DC(1,1)*0.4+X(3) DC(1,1)*0.2+X(3) X(3)];'...
'tY=[Y(4) 0.2*DD(2,1)+Y(4) DDD(2,1)*0.1+0.4*DD(2,1)+Y(4)
 DDC(2,1)*0.1+DC(2,1)*0.4+Y(3) DC(2,1)*0.2+Y(3) Y(3)];'...
'tZ=[Z(4) 0.2*DD(3,1)+Z(4) DDD(3,1)*0.1+0.4*DD(3,1)+Z(4)
 DDC(3,1)*0.1+DC(3,1)*0.4+Z(3) DC(3,1)*0.2+Z(3) Z(3)];'...
'[CDX,CDY,CDZ]=bezier3(tX,tY,tZ);'...
...
'tX=[X(2) 0.2*DB(1,2)+X(2) DDB(1,2)*0.1+0.4*DB(1,2)+X(2)
 DDC(1,2)*0.1+DC(1,2)*0.4+X(3) DC(1,2)*0.2+X(3) X(3)];'...
'tY=[Y(2) 0.2*DB(2,2)+Y(2) DDB(2,2)*0.1+0.4*DB(2,2)+Y(2)
 DDC(2,2)*0.1+DC(2,2)*0.4+Y(3) DC(2,2)*0.2+Y(3) Y(3)];'...
'tZ=[Z(2) 0.2*DB(3,2)+Z(2) DDB(3,2)*0.1+0.4*DB(3,2)+Z(2)
 DDC(3,2)*0.1+DC(3,2)*0.4+Z(3) DC(3,2)*0.2+Z(3) Z(3)];'...
'[BCX,BCY,BCZ]=bezier3(tX,tY,tZ);'...
...
'tX=[X(1) 0.2*DA(1,2)+X(1) DDA(1,2)*0.1+0.4*DA(1,2)+X(1)
 DDD(1,2)*0.1+DD(1,2)*0.4+X(4) DD(1,2)*0.2+X(4) X(4)];'...
'tY=[Y(1) 0.2*DA(2,2)+Y(1) DDA(2,2)*0.1+0.4*DA(2,2)+Y(1)
 DDD(2,2)*0.1+DD(2,2)*0.4+Y(4) DD(2,2)*0.2+Y(4) Y(4)];'...
'tZ=[Z(1) 0.2*DA(3,2)+Z(1) DDA(3,2)*0.1+0.4*DA(3,2)+Z(1)
 DDD(3,2)*0.1+DD(3,2)*0.4+Z(4) DD(3,2)*0.2+Z(4) Z(4)];'...
'[ADX,ADY,ADZ]=bezier3(tX,tY,tZ);'...
...
'tX=[X(1) 0.2*DA(1,1)+X(1) DDA(1,1)*0.1+0.4*DA(1,1)+X(1)
 DDB(1,1)*0.1+DB(1,1)*0.4+X(2) DB(1,1)*0.2+X(2) X(2)];'...
'tY=[Y(1) 0.2*DA(2,1)+Y(1) DDA(2,1)*0.1+0.4*DA(2,1)+Y(1)
 DDB(2,1)*0.1+DB(2,1)*0.4+Y(2) DB(2,1)*0.2+Y(2) Y(2)];'...
'tZ=[Z(1) 0.2*DA(3,1)+Z(1) DDA(3,1)*0.1+0.4*DA(3,1)+Z(1)
 DDB(3,1)*0.1+DB(3,1)*0.4+Z(2) DB(3,1)*0.2+Z(2) Z(2)];'...
'[ABX,ABY,ABZ]=bezier3(tX,tY,tZ);'...
...
'plot3(ABX,ABY,ABZ);'...
'title(''Dans le plan X,Y,Z'');'...
'view(temp1,temp2);'...
'hold on;'...
'plot3(ADX,ADY,ADZ);'...
'plot3(CDX,CDY,CDZ);'...
'plot3(BCX,BCY,BCZ);'...
'xlabel(''x'');'...
'ylabel(''y'');'...
'zlabel(''z'');'...
'text(X(1),Y(1),Z(1),''A'');'...
'text(X(2),Y(2),Z(2),''B'');'...
'text(X(3),Y(3),Z(3),''C'');'...
'text(X(4),Y(4),Z(4),''D'');'...
'hold off;'...
'Temps=cputime-temps+Temps;'...
]); % fonction, script à appeler ou
% commande à exécuter
%
%On place les points dans le plan (X,Z)
%
figure(num);
subplot(2,2,2);
hold on
axis([0 1 0 1 ]);
title('Dans le plan X,Z')
hold off
% affichage
TxtMin = uicontrol(gcf, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [420 21 80 20],... % position du bouton
'string','dans (X,Z)');
% bouton poussoir pour placer A
BP1 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [420 0 20 20],... % position du bouton
'string', 'A', ... % texte du bouton
'callback', [...
'figure(num);'...
'subplot(2,2,2);'...
'hold on;'...
'[X(1),Z(1)]=ginput(1);'...
'plot(X(1),Z(1),''r+'');'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour placer B
BP2 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique 'style', 'push', ... % style du bouton
'position', [440 0 20 20],... % position du bouton
'string', 'B', ... % texte du bouton
'callback', [...
'figure(num);'...
'subplot(2,2,2);'...
'hold on;'...
'[X(2),Z(2)]=ginput(1);'...
'plot(X(2),Z(2),''r+'');'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour placer C
BP3 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [460 0 20 20],... % position du bouton
'string', 'C', ... % texte du bouton
'callback', [...
'figure(num);'...
'subplot(2,2,2);'...
'hold on;'...
'[X(3),Z(3)]=ginput(1);'...
'plot(X(3),Z(3),''r+'');'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour placer D
BP4 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [480 0 20 20],... % position du bouton
'string', 'D', ... % texte du bouton
'callback', [...
'figure(num);'...
'subplot(2,2,2);'...
'hold on;'...
'[X(4),Z(4)]=ginput(1);'...
'plot(X(4),Z(4),''r+'');'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
%On place les points dans le plan (Y,Z)
figure(num)
hold on;
subplot(2,2,3);
axis([0 1 0 1 ]);
title('Dans le plan Y,Z')
hold off
% affichage
TxtMin = uicontrol(gcf, ... % handle sur fenêtre
 graphique
'style', 'text', ... % style du bouton
'position', [339 21 80 20],... % position du bouton
'string','dans (Y,Z)');
% bouton poussoir pour placer A
BP1 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [340 0 20 20],... % position du bouton
'string', 'A', ... % texte du bouton
'callback', [...
'figure(num);'...
'subplot(2,2,3);'...
'hold on;'...
'[Y(1),Z(1)]=ginput(1);'...
'plot(Y(1),Z(1),''r+'');'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour placer B
BP2 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique 'style', 'push', ... % style du bouton
'position', [360 0 20 20],... % position du bouton
'string', 'B', ... % texte du bouton
'callback', [...
'figure(num);'...
'subplot(2,2,3);'...
'hold on;'...
'[Y(2),Z(2)]=ginput(1);'...
'plot(Y(2),Z(2),''r+'');'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour placer C
BP3 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [380 0 20 20],... % position du bouton
'string', 'C', ... % texte du bouton
'callback', [...
'figure(num);'...
'subplot(2,2,3);'...
'hold on;'...
'[Y(3),Z(3)]=ginput(1);'...
'plot(Y(3),Z(3),''r+'');'...
'hold off;'...
]); % fonction, script à appeler ou
% commande à exécuter
% bouton poussoir pour placer D
BP4 = uicontrol(gcf, ... % handle sur la fenêtre
 graphique
'style', 'push', ... % style du bouton
'position', [400 0 20 20],... % position du bouton
'string', 'D', ... % texte du bouton
'callback', [...
'figure(num);'..